ない以下に定義するように私はクラス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);
}
}
シリアライズ正常に動作します。しかし、デシリアライズするとき:それはJsonSerializationException
のでreader.ReadAsString
がnullスロー
var foo = JsonConvert.DeserializeObject<Foo>("\"something\"");
。
しかし、それは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から' StringIdConverter'を参照してください。シリアライズ/値としてプロパティをデシリアライズ、オブジェクトとしてではありません](https://stackoverflow.com/a/40480742/3744182)。 – dbc
@dbcそれは面白いです。 'JToken.Load(reader)'は正しく文字列を読み込みます。あなたはreader.ReadAsString()がなぜそうでないのか知っていますか? –
はい、今すぐ回答を追加してください。 – dbc