14

私はJSONにまったく慣れておらず、現在(逆)シリアル化について学んでいます。Web ページから JSON 文字列を取得し、それをオブジェクトに逆シリアル化しようとしています。問題は、ルート json キーは静的ですが、基になるキーは動的であり、それらが逆シリアル化されるとは予想できないことです。文字列のミニ例を次に示します。

{
    "daily": {
        "1337990400000": 443447,
        "1338076800000": 444693,
        "1338163200000": 452282,
        "1338249600000": 462189,
        "1338336000000": 466626
    }
}

私のアプリケーションの別の JSON 文字列では、JavascriptSerializerクラス構造を使用してキーを予測していました。この文字列をオブジェクトに逆シリアル化する最良の方法は何ですか?

4

4 に答える 4

34

真剣に、動的ルートをたどる必要はありません。使用する

var deser = new JavaScriptSerializer()
    .Deserialize<Dictionary<string, Dictionary<string, int>>>(val);
var justDaily = deser["daily"];

辞書を取得するには、たとえば次のことができます

foreach (string key in justDaily.Keys)
    Console.WriteLine(key + ": " + justDaily[key]);

存在するキーと対応する値を取得します。

于 2012-11-22T18:10:54.203 に答える
6

dynamic.NET 4 以降で使用できます。たとえば、JSON.NET を使用すると、次のことができます。

dynamic obj = JsonConvert.Deserialize<dynamic>("{x: 'hello'}");

その後、次のことができます。

var str = obj.x;

ただし、数字キーをどのように処理するかは不明です。JObjectもちろん、それ自体を直接使用することもできます。次に例を示します。

var obj = JObject.Parse("{'123456': 'help'}");
var str = obj["123456"];
于 2012-11-22T17:49:52.443 に答える
-2

с# では変数が数字で始まると定義できないため、これを使用するのは便利ではありません。キーにプレフィックスを追加します。

またはこれを試してください:

string json = "
{ daily:[
  { key: '1337990400000', val:443447 },
  { key: '1338076800000', val:444693 },
  { key: '1338163200000', val:452282 },
  { key: '1338249600000', val:462189 },
  { key: '1338336000000', val:466626 }]
}";

public class itemClass
{
  public string key; // or int
  public int val;
}

public class items
{
  public itemClass[] daily;
}

items daily = (new JavascriptSerializer()).Deserialize<items>(json);

次に、次のことができます。

var itemValue = items.Where(x=>x.key=='1338163200000').Select(x=>x.val).FirstOrDefault();
于 2012-11-22T17:49:52.260 に答える