web-dev-qa-db-ja.com

動的データでJSon.NETを使用してJSONを逆シリアル化する

一部のJSONデータをアプリケーションのオブジェクトに逆シリアル化しようとしています。これまでは、JSONデータのプロパティが静的(値を持つキー)であったため、問題はありませんでした。これで、キーが動的なデータであるという結果が得られました。

JSONURLの例を次に示します。

http://en.wikipedia.org/w/api.php?action=query&format=json&pageids=6695&prop=info

結果として得られるJSONは次のとおりです。

{ "query" : { "pages" : { "6695" : { "counter" : "",
          "lastrevid" : 468683764,
          "length" : 8899,
          "ns" : 0,
          "pageid" : 6695,
          "title" : "Citadel",
          "touched" : "2012-01-03T19:16:16Z"
        } } } }

「ページ」データをオブジェクトに逆シリアル化できないことを除けば、これはすばらしいことです。ページのクラスを定義する場合は、次のようにする必要があります。

public class 6695
{
    public string counter { get; set; }
    public int lastrevid { get; set; }
    public int length { get; set; }
    public int ns { get; set; }
    public int pageid { get; set; }
    public string title { get; set; }
    public string touched { get; set; }
}

(JsonConvert.Deserialize(jsondata)を使用して)コンテンツを逆シリアル化するには、6695というクラスを作成できないことは誰もが知っています。それだけでなく、クラスの名前も異なる必要があります(たとえば、pageid = 7145 7145クラスである必要があります)。

JObject.Parse(content)のようなものを使用してから、JArrayとしてアイテムにアクセスすると、いくつかの値を取得するように見えるかもしれませんが、それはかなり醜く、pages配列からデータを取得しようとしています。

これを手伝ってくれる人を探しています。珍しいことではないと思います。以前に出会ったJSONデータではなく、その処理方法がわかりません。

ありがとう!

PSは、これがWindows Phone 7にあることを忘れたため、「動的」は利用できません。

17
Bil Simser

https://github.com/facebook-csharp-sdk/simple-jsonhttps://nuget.org/packages/SimpleJson )の使用方法は次のとおりです。 。

var text = "{\"query\":{\"pages\":{\"6695\":{\"pageid\":6695,\"ns\":0,\"title\":\"Citadel\",\"touched\":\"2012-01-03T19:16:16Z\",\"lastrevid\":468683764,\"counter\":\"\",\"length\":8899}}}}";

(ダイナミックを使用)

dynamic json = SimpleJson.DeserializeObject(text);
string title = json.query.pages["6695"].title;

foreach (KeyValuePair<string, dynamic> page in json.query.pages)
{
    var id = page.Key;
    var pageId = page.Value.pageid;
    var ns = page.Value.ns;
}

(強く型付けされたクラスを使用)

class result
{
    public query query { get; set; }
}
class query
{
    public IDictionary<string, page> pages { get; set; }
}
class page
{
    public long pageid { get; set; }
    public string title { get; set; }
}

var result = SimpleJson.DeserializeObject<result>(text);

[更新]

動的がサポートされておらず、強く型付けされたクラスを使用したくないWindowsPhone。

var json = (IDictionary<string, object>)SimpleJson.DeserializeObject(text);
var query = (IDictionary<string, object>)json["query"];
var pages = (IDictionary<string, object>)query["pages"];
var pageKeys = pages.Keys;
var page = (IDictionary<string, object>)pages["6695"];
var title = (string)page["title"];
18
prabir

最も簡単な方法。この特定のケースでは、おそらくdynamicに移動します。

dynamic data = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(json);
var lastRevId = data.query.pages["6695"].lastrevid;

[]名で任意の要素を参照できるため、data["query"]["pages"]["6695"]["lastrevid"]のようなことができます。これは、名前がc#で有効でないすべての小さなオブジェクトによって取得されます。

27
Buildstarted

以下の例がお役に立てば幸いです。私は常にjsonに一致するモデルを設計します。独自のモデル設計である場合は、オブジェクトを操作する方がはるかに優れています。

Jsonからc#モデルを生成するのは非常に簡単です。私はこのウェブサイトを使用してモデルを生成します: http://json2csharp.com

完全な例は次のとおりです。

C#コード:

    var targetsObject = Newtonsoft.Json.JsonConvert.DeserializeObject<YourModel>(jsonString);

JSON:

    {
      "investors": [
        {
          "name": "06",
          "programs": [
            {
              "name": "Conventional",
              "value": "3.5"
            },
            {
              "name": "FHA - Standard",
              "value": "5.0"
            },
            {
              "name": "FHA - Streamline",
              "value": ""
            },
            {
              "name": "VA",
              "value": "5.5"
            },
            {
              "name": "VA IRRRL",
              "value": "6.0"
            },
            {
              "name": "Non-Prime",
              "value": ""
            }
          ]
        },
        {
          "name": "07",
          "programs": [
            {
              "name": "Conventional",
              "value": "3.5"
            },
            {
              "name": "FHA - Standard",
              "value": "5.0"
            },
            {
              "name": "FHA - Streamline",
              "value": "7.0"
            },
            {
              "name": "VA",
              "value": "5.5"
            },
            {
              "name": "VA IRRRL",
              "value": ""
            },
            {
              "name": "Non-Prime",
              "value": ""
            }
          ]
        },
        {
          "name": "08",
          "programs": [
            {
              "name": "Conventional",
              "value": "3.5"
            },
            {
              "name": "FHA - Standard",
              "value": "5.0"
            },
            {
              "name": "FHA - Streamline",
              "value": "7.0"
            },
            {
              "name": "VA",
              "value": "5.5"
            },
            {
              "name": "VA IRRRL",
              "value": ""
            },
            {
              "name": "Non-Prime",
              "value": ""
            }
          ]
        },
        {
          "name": "09",
          "programs": [
            {
              "name": "Conventional",
              "value": "3.5"
            },
            {
              "name": "FHA - Standard",
              "value": "5.0"
            },
            {
              "name": "FHA - Streamline",
              "value": ""
            },
            {
              "name": "VA",
              "value": "5.5"
            },
            {
              "name": "VA IRRRL",
              "value": ""
            },
            {
              "name": "Non-Prime",
              "value": ""
            }
          ]
        },
        {
          "name": "10",
          "programs": [
            {
              "name": "Conventional",
              "value": ""
            },
            {
              "name": "FHA - Standard",
              "value": ""
            },
            {
              "name": "FHA - Streamline",
              "value": ""
            },
            {
              "name": "VA",
              "value": ""
            },
            {
              "name": "VA IRRRL",
              "value": ""
            },
            {
              "name": "Non-Prime",
              "value": "2.0"
            }
          ]
        },
        {
          "name": "11",
          "programs": [
            {
              "name": "Conventional",
              "value": "3.5"
            },
            {
              "name": "FHA - Standard",
              "value": "5.0"
            },
            {
              "name": "FHA - Streamline",
              "value": ""
            },
            {
              "name": "VA",
              "value": "6.0"
            },
            {
              "name": "VA IRRRL",
              "value": "6.0"
            },
            {
              "name": "Non-Prime",
              "value": ""
            }
          ]
        },
        {
          "name": "12",
          "programs": [
            {
              "name": "Conventional",
              "value": "3.5"
            },
            {
              "name": "FHA - Standard",
              "value": "5.0"
            },
            {
              "name": "FHA - Streamline",
              "value": ""
            },
            {
              "name": "VA",
              "value": "5.5"
            },
            {
              "name": "VA IRRRL",
              "value": "6.0"
            },
            {
              "name": "Non-Prime",
              "value": ""
            }
          ]
        },
        {
          "name": "13",
          "programs": [
            {
              "name": "Conventional",
              "value": ""
            },
            {
              "name": "FHA - Standard",
              "value": "5.0"
            },
            {
              "name": "FHA - Streamline",
              "value": ""
            },
            {
              "name": "VA",
              "value": ""
            },
            {
              "name": "VA IRRRL",
              "value": ""
            },
            {
              "name": "Non-Prime",
              "value": "2.0"
            }
          ]
        }
      ]
    }

モデル:

    public class Program
    {
        public string name { get; set; }
        public string value { get; set; }
    }

    public class Investor
    {
        public string name { get; set; }
        public List<Program> programs { get; set; }
    }

    public class RootObject
    {
        public List<Investor> investors { get; set; }
    }
2
Nour Lababidi

Json.netを使用すると、次のことができます。

Dictionary<string,object> result = JsonConvert.DeserializeObject<Dictionary<string,object>>(json);
foreach(var item in result)
    Console.WriteLine(item.Key + " " + item.Value);
1
N_A

たぶん、1つの予約済み属性を使用してオブジェクト型を含め、次にこの記事に示すように基本型を使用することができます: JSON.NETを使用した動的型

0
vitaly-t

JSON文字列での単純な検索と置換はどうですか?それは最もエレガントな解決策ではないかもしれませんが、おそらく最も実用的な解決策になるでしょう。

0
Tom