0

JSONデータを読み取り、統計を作成するアプリケーションを開発していますが、問題が発生しました。

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

{
"position":[
  {
     "someKey1":"someVal1",
     "someKey2":"someVal2",
  },
  {
     "someKey1":"someVal3",
     "someKey2":"someVal4",
  }
}

someKeysとsomeValuesにアクセスしたい。

私はそれを次のような辞書に変換しています:

Dictionary<string, object> values = deserializeJSON(json_string);

編集1:申し訳ありませんが、deserializeJSONを追加するのを忘れました:

private Dictionary<string, object> deserializeJSON(string p_jsonObject)
{
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    return serializer.Deserialize<Dictionary<string, dynamic>>(p_jsonObject);
}

キー「position」を使用して値のリストにアクセスするのに問題があります。値のタイプ["position"]を出力しようとすると、次のようになります。

System.Collections.ArrayList

ですから、これを繰り返すことができると思いましたが、できません。列挙子を使用してみました(オブジェクトを反復処理できるようになり、キャストするにはArrayListに追加する必要があることをここで読んでください):

ArrayList arr = new ArrayList();
IEnumerable enumerable = values["position"] as IEnumerable;

foreach (object element in enumerable)
{
    arr.Add(element);
}

arr [0]を印刷すると、次のようになります。

System.Collections.Generic.Dictionary`2[System.String,System.Object]

ここで私は混乱しています。それはsomeKeysとsomeValsのリストだと思いますが、どちらが正しいはずですよね?今、私は運が悪かったので、これらの値にアクセスしようとしました。arr [0] ["someKey1"]を試しましたが、「オブジェクト」にインデックスを適用できないというエラーが発生します。

解決策について何かアイデアはありますか?理想的には、よりエレガントなソリューションですか?:)

前もって感謝します

4

2 に答える 2

3

Linq to JSONを使用できます(NuGet から Newtonsoft の JSON.NET を追加します)。

JObject jo = JObject.Parse(json);
var value = (string)jo["position"][1]["someKey1"]; // someVal3

別のサンプル:

JObject jo = JObject.Parse(json);
JArray positions = (JArray)jo["position"];
foreach (var item in positions)
{
    // use (string)item["someKey1"]
    // use (string)item["someKey2"]
}
于 2013-01-28T20:33:06.283 に答える
2

次のように要素にアクセスできます。

LinqPad デモ

var enumerable = (IEnumerable)values["position"]; // Will get you the enumerable ArrayList
(Dictionary<string,object>)values["position"][0]; // Will get you the First element of the ArrayList
(string)values["position"][0]["someKey1"]; // Will get you someKey1 from the first position of position
于 2013-01-28T21:05:32.327 に答える