2

次の形式のデータがあります。

{
  "sections" : [
    {
      "section" : {
        "Term" : "News",
        "Term ID" : "4,253"
      }
    },
    {
      "section" : {
        "Term" : "Sports",
        "Term ID" : "4,254"
      }
    },
   // ...
  ]
}

次のクラスのコレクションにシリアル化したいと思います。

public class Section
{

    public string Name;
    public int Tid;
}

JSON.NETを使用して、これを行うために使用しているコードは次のとおりです。

        // e.Result is the downloaded JSON
        JObject jsonData = JObject.Parse(e.Result);
        var sections = jsonData["sections"].Select(obj => obj["section"]).Select(sectData => new Section()
        {
            Name = HttpUtility.HtmlDecode(sectData["Term"].Value<string>().Replace("\"", "")),
            Tid = int.Parse(sectData["Term ID"].Value<string>().Replace(",", ""))
        });

        foreach (Section s in sections)
        {
            // _sections is an ObservableCollection<Section>
            _sections.Add(s);
        }

少しゴツい感じです。これをもっとエレガントにできますか?

特にforeach最後のループ。addAllまたはconcatまたは何かのような方法を使用したいと思います。

4

3 に答える 3

2

線に沿った何か...

JavaScriptSerializer serializer = new JavaScriptSerializer();
List<Section> sections = serializer.Deserialize<List<Sections>>(e.Result);

技術的に JavaScriptSerializer に取って代わる DataContractJsonSerializer も見てください。

于 2010-10-22T19:48:05.280 に答える
0

Replace数値を解析する前に桁区切り記号を削除するために使用する必要はありません。Parseメソッドは、それらを許可し、実際にカンマを桁区切り記号として使用するカルチャを使用することを確認するだけで、それらを処理できます。

Tid = Int32.Parse(sectData["Term ID"].Value<string>(), NumberStyles.AllowThousands, CultureInfo.InvariantCulture)

_sections変数が の場合、そのList<Section>AddRange メソッドを使用して一度にすべてを追加できます。

_sections.AddRange(sections);

または、リストにそれらのアイテムのみを含める場合は、最初にリストを作成してからアイテムを追加するのではなく、結果からリストを作成できます。

_sections = sections.ToList();
于 2010-10-22T19:47:58.400 に答える
0

Select ステートメントの匿名デリゲートを次のように書き直すことをお勧めします。

var sections = jsonData["sections"].Select(obj => obj["section"]).Select(sectData =>
    {
        var section = new Section()
        {
            Name = HttpUtility.HtmlDecode(sectData["Term"].Value<string>().Replace("\"", `enter code here`"")),
            Tid = int.Parse(sectData["Term ID"].Value<string>().Replace(",", ""))
        };
        _sections.Add(section);
        return section;
    });

ラムダはクロージャーを形成できるため、_sections コレクションは Select に渡されるデリゲートで使用できることに注意してください。このアプローチにより、foreach ループが解消されます。

于 2010-10-22T19:58:53.113 に答える