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最后的那个循环。我宁愿使用类似addAllconcat之类的方法。

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变量是 a 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;
    });

请记住,lambda 可以形成闭包,因此 _sections 集合在传递给 Select 的委托中可用。这种方法应该摆脱 foreach 循环。

于 2010-10-22T19:58:53.113 回答