web-dev-qa-db-ja.com

JSON文字列をDictionary <string、object>に逆シリアル化します

私はこの文字列を持っています:

[{ "processLevel" : "1" , "segments" : [{ "min" : "0", "max" : "600" }] }]

私はオブジェクトをデシリアライズしています:

object json = jsonSerializer.DeserializeObject(jsonString);

オブジェクトは次のようになります。

object[0] = Key: "processLevel", Value: "1"
object[1] = Key: "segments", Value: ...

そして、辞書を作成しようとしています:

Dictionary<string, object> dic = json as Dictionary<string, object>;

しかし、dicnullを取得します。

問題は何ですか?

30
ohadinho

Nullになる理由については、mridulaの答えをご覧ください。ただし、json文字列を辞書に直接変換する場合は、次のコードスニペットを試すことができます。

    Dictionary<string, object> values = 
JsonConvert.DeserializeObject<Dictionary<string, object>>(json);
29
santosh singh

asキーワードの MSDNドキュメント は、ステートメント_expression as type_がステートメントexpression is type ? (type)expression : (type)nullと同等であることを示しています。 json.GetType()を実行すると、_System.Object[]_ではなく_System.Collections.Generic.Dictionary_が返されます。

Jsonオブジェクトをデシリアライズするオブジェクトのタイプが複雑なこれらのような場合、Json.NETのようなAPIを使用します。独自のデシリアライザを次のように記述できます。

_class DictionaryConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        Throw(new NotImplementedException());            
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        // Your code to deserialize the json into a dictionary object.

    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        Throw(new NotImplementedException());   
    }
}
_

そして、このシリアライザーを使用してjsonを辞書オブジェクトに読み込むことができます。 です。

6
mridula

私はこの方法が好きです:

using Newtonsoft.Json.Linq;
//jsonString is your JSON-formatted string
JObject jsonObj = JObject.Parse(jsonString);
Dictionary<string, string> dictObj = jsonObj.ToObject<Dictionary<string, object>>();

dictObjを辞書として使用して、必要なものにアクセスできるようになりました。値を文字列として取得する場合は、Dictionary<string, string>を使用することもできます。

5
Blairg23