2011-06-20 26 views
22

オブジェクトをDictionaryJsonConvert.DeserializeObject<IDictionary<string,object>>(json))に逆シリアル化すると、JObjectにデシリアライズされます。ネストしたオブジェクトを非直列化して強制的にDictionaryにすることはできますか?Json.NET:ネストされた辞書の逆シリアル化

答えて

32

私はCustomCreationConverter実装を提供することにより、Dictionary<string,object>に、すべてのネストされたオブジェクトを変換する方法を見つけました:

class MyConverter : CustomCreationConverter<IDictionary<string, object>> 
{ 
    public override IDictionary<string, object> Create(Type objectType) 
    { 
     return new Dictionary<string, object>(); 
    } 

    public override bool CanConvert(Type objectType) 
    { 
     // in addition to handling IDictionary<string, object> 
     // we want to handle the deserialization of dict value 
     // which is of type object 
     return objectType == typeof(object) || base.CanConvert(objectType); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     if (reader.TokenType == JsonToken.StartObject 
      || reader.TokenType == JsonToken.Null) 
      return base.ReadJson(reader, objectType, existingValue, serializer); 

     // if the next token is not an object 
     // then fall back on standard deserializer (strings, numbers etc.) 
     return serializer.Deserialize(reader); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var json = File.ReadAllText(@"c:\test.json"); 
     var obj = JsonConvert.DeserializeObject<IDictionary<string, object>>(
      json, new JsonConverter[] {new MyConverter()}); 
    } 
} 

ドキュメント:CustomCreationConverter with Json.NET

-1

オルタナティブ/更新:

私は逆シリアル化するために必要な辞書の辞書Stringと現在のJson.NET(5.0)で私はCustomConverterを作成する必要はありません、私はjus tは(VB.Netで)使用:

JsonConvert.DeserializeObject(Of IDictionary(Of String, IDictionary(Of String, String)))(jsonString) 

または、C#で:

JsonConvert.DeserializeObject<IDictionary<String, IDictionary<String, String>>(jsonString); 
+1

これは、適切に変換され、再帰/未知のJSON構造をサポートしていません。 –

+0

これは具体的には固定レベルの入れ子 – Javier

関連する問題