web-dev-qa-db-ja.com

動的オブジェクトを使用してJSONを逆シリアル化する

市外局番の長いリストが付属するJSONオブジェクトがあります。残念ながら、各市外局番はDataオブジェクトのリストにあるオブジェクト名です。 RestSharpがコンテンツを逆シリアル化できるようにするクラスを作成するにはどうすればよいですか?

これが私のクラスの外観です。

public class phaxioResponse
{
    public string success { get; set; }
    public string message { get; set; }
    public List<areaCode> data { get; set; }

    public class areaCode
    {
        public string city { get; set; }
        public string state { get; set; }
    }
}

そしてここにJSONコンテンツがあります:

{
    success: true
    message: "277 area codes available."
    data: {
        201: {
            city: "Bayonne, Jersey City, Union City"
            state: "New Jersey"
        }
        202: {
            city: "Washington"
        state: "District Of Columbia"
        } [...]
}
11
PeteFox

このJSONはC#に対応していないため、正しくハックアウトするために少しハックする必要がありました。しかし、結果はかなりいいです。

var json = JsonConvert.DeserializeObject<dynamic>(sampleJson);
var data = ((JObject)json.data).Children();
var stuff = data.Select(x => new { AreaCode = x.Path.Split('.')[1], City = x.First()["city"], State = x.Last()["state"] });

このコードは、データを最もよく表す匿名型を生成します。ただし、より通常のDTOクラスの場合、匿名型はctorに簡単に置き換えることができます。

出力は次のようになります。

Deserialization Output

18
Pete Garafano

あなたのjsonは正しくありませんが、それを修正する場合は、 http://json2csharp.com/ のようなjson-to-csharpツールを使用してクラスを生成できます:

public class __invalid_type__201
{
    public string city { get; set; }
    public string state { get; set; }
}

public class Data
{
    public __invalid_type__201 __invalid_name__201 { get; set; }
}

public class RootObject
{
    public bool success { get; set; }
    public string message { get; set; }
    public Data data { get; set; }
}
3
Zdravko Danev

RestSharpについては何も知りませんが、サーバー側でNewtonsoftを使用している場合は、メソッドにJObjectを渡すだけです。次に、オブジェクトに問い合わせて、実際のオブジェクトのタイプを確認し、JObject.ToObject()を使用してオブジェクトを変換できます。

0
Ash8087

Dictionary<int,areaCode>が最も簡単な方法です。

public class phaxioResponse
    {
        public string success { get; set; }
        public string message { get; set; }
        public Dictionary<int,areaCode> data { get; set; }

        public class areaCode
        {
            public string city { get; set; }
            public string state { get; set; }
        }
    }

次に:

    var res= JsonConvert.DeserializeObject<phaxioResponse>(json);
    Console.WriteLine(string.Join(",", res.data));
0
MistyK