【发布时间】:2017-09-03 15:18:02
【问题描述】:
我有一个类Foo 及其FooConverter,定义如下:
[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
虽然我可以通过在ReadJson 中使用serializer.Deserialize<string>(reader) 来修复FooConverter,但我仍然想了解为什么reader.ReadAsString 在FooConverter.ReadJson 中失败。
【问题讨论】:
-
如果您正在寻找可以将对象序列化为字符串原语的
JsonConverter,请参阅Json.Net: Serialize/Deserialize property as a value, not as an object 中的StringIdConverter。 -
@dbc 这很有趣。
JToken.Load(reader)正确读取字符串。你知道为什么 reader.ReadAsString() 不知道吗? -
是的,现在添加答案。