1

JSON を C# のオブジェクトに解析する必要があります。私は Newtonsoft と JavaScriptSerializer を見てきましたが、それらをうまく使用する方法がわからないか、変更される可能性のあるフォーマットの処理が不十分で、複雑な構造では扱いにくいかのどちらかです。次のようなことができるものが欲しい:

JsonObject j = Deserialize(mystring);
String[] earthColors = j.maps["earth"].colors;

構造の残りの部分は気にしません。

4

2 に答える 2

4

Json.Netを使用しないことを再考する必要があると思います

string mystring = 
    @"
    {
        ""maps"": {
            ""earth"": {
                ""colors"": [
                    ""blue"",
                    ""green""
                ]
            },
            ""moon"": {
                ""colors"": [
                    ""black"",
                    ""white""
                ]
            }
        }
    ";

dynamic j = JsonConvert.DeserializeObject(mystring);
foreach (var c in j.maps["earth"].colors)
{
    Console.WriteLine(c);
}
于 2012-05-18T21:31:58.280 に答える
0

静的クラス アプローチ

JSON をオブジェクトに変換する一般的な方法を次に示します (必ず を含めてSystem.Web.Script.Serializationください)。

    public static T JsonToObject<T>(string JsonData)
    {
        // Deserialize the JSON into the object
        JavaScriptSerializer jss = new JavaScriptSerializer();
        T rf = (T)jss.Deserialize(JsonData, typeof(T));

        return rf;
    }

オブジェクトを変換して JSON に戻すには、次の一般的な方法を使用します。

    public static string ObjectToJson<T>(T rf)
    {
        // Serialize the object as JSON
        StringBuilder sb = new StringBuilder();
        JavaScriptSerializer jss = new JavaScriptSerializer();
        jss.Serialize(rf, sb);

        return sb.ToString();
    }

これを使用するには、JSON 応答に一致するクラスを作成し、JsonToObjectメソッドを呼び出すだけです。

JsonObject j = JsonToObject(mystring);

動的アプローチ

より動的なアプローチについては、次のようなものを見てください。

JavaScriptSerializer jss = new JavaScriptSerializer();
var JsonObject = jss.Deserialize<dynamic>(mystring);

これによりJsonObject動的に が作成され、スタイル アクセサーを使用できるようになりますDictionary。事前にクラスを作成する必要はありません。したがって、指定された JSON 応答に対して

{ "maps": ["earth": {"colors": ["purple","chartreuse"] }] }

c クラスは動的に作成され、次のようにアクセスできます。

JsonObject.maps["earth"].colors[0] == "purple";
JsonObject.maps["earth"].colors[1] == "chartreuse";
于 2012-05-18T19:35:15.143 に答える