不工作時,我有一個類Foo
及其作爲FooConverter
定義如下:定製JsonConverter使用JsonReader代替JsonSerializer
[JsonConverter(typeof(FooConverter))]
public class Foo
{
public string Something { get; set; }
}
public class FooConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteValue(((Foo)value).Something);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var str = reader.ReadAsString();
if (str == null)
{
throw new JsonSerializationException();
}
// return new Foo {Something = serializer.Deserialize<string>(reader)};
return new Foo {Something = str};
}
public override bool CanConvert(Type objectType)
{
return objectType == typeof(Foo);
}
}
序列化工作正常。但是,反序列化時:
var foo = JsonConvert.DeserializeObject<Foo>("\"something\"");
它拋出JsonSerializationException
因爲reader.ReadAsString
爲空。
但我不明白爲什麼它必須是null
... reader.ReadAsString
作品完美地發現,如果我做手工,像這樣:
var reader = new JsonTextReader(new StringReader("\"something\""));
var str = reader.ReadAsString(); // str is now `something` NOT null
雖然我可以用serializer.Deserialize<string>(reader)
在ReadJson
修復FooConverter
,我仍然想知道爲什麼reader.ReadAsString
在FooConverter.ReadJson
失敗。
如果你正在尋找一個'JsonConverter'可序列化對象作爲字符串原始的,看到'StringIdConverter'從[Json.Net:可以按如下步驟進行修改序列化/反序列化屬性的值,不作爲對象](https://stackoverflow.com/a/40480742/3744182)。 – dbc
@dbc這很有趣。 'JToken.Load(reader)'正確讀取字符串。你知道爲什麼reader.ReadAsString()不? –
是的,現在添加一個答案。 – dbc