不工作时,我有一个类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