【问题标题】:How do I parse a polymorphic JSON array?如何解析多态 JSON 数组?
【发布时间】:2010-10-03 01:19:13
【问题描述】:

我有一个 JSON 格式的文件,其中包含个人用户的记录。一些用户的记录中间有一个评论字段。我只想解析顶级项目( 全名 贡献者姓名 电子邮件)

使用 Newtonsoft.JSON 解析器,但我似乎无法让它识别单个对象。当我将整个字符串解析成一个大对象时,我不知道如何迭代单个对象。

这就是我尝试的方式(逐个属性),但如果它们出现故障或有子属性,它就不起作用。我需要将它放入一个对象中:

StreamReader re = File.OpenText("C:\\dropbox\\my dropbox\\clients\\towson\\english 317\\Ning Archive\\ning-members.json");
JsonTextReader reader = new JsonTextReader(re);
string ct = "";

try
{
    ct += "<table style='border:1px solid black'>";
    while (reader.Read())
    {
        if (reader.TokenType == JsonToken.PropertyName)
        {
            if (reader.Value.ToString() == "fullName")
            {
                reader.Read();
                ct += "\r\n\r\n<tr><td>" + reader.Value + "</td>";
            }
            if (reader.Value.ToString() == "contributorName")
            {
                reader.Read();
                ct += "<td>" + reader.Value + "</td></tr>";
            }
            if (reader.Value.ToString() == "email")
            {
                reader.Read();
                ct += "<td>" + reader.Value + "</td>";
            }
        }
    }       
}
catch { }

ct+="</table>";
namesText.Text = ct;

请注意,第一条记录有一个我不关心的 cmets 字段,但是当我尝试解析为流时会妨碍顺序。

[
{
    "createdDate": "2010-09-10T14:16:08.271Z",
    "fullName": "Lisa Meloncon",
    "gender": "f",
    "country": "US",
    "birthdate": "1969-05-14",
    "comments": [
        {
            "id": "6292914:Comment:272",
            "contributorName": "0upfj0fd33932",
            "description": "Thanks for joining! I'm working up a schedule for the students a bit late so I can assess some of their early writing (including the first assignment, a general evaluation of business writing skills) and determine a course that will address their needs. I plan to make liberal use of technology this semester, with a Screencasting assignment, some intermediate Word formatting drills, and various other activities.",
            "createdDate": "2010-09-10T18:07:38.272Z"
        }
    ],
    "email": "meloncon@xxx.com",
    "profilePhoto": "http://api.ning.com:80/files/251IcCtIBC3dGALHpG3ruYfg0Ip*EFJApPyMVGkiVArSUEvF*dK8A5grvPvl8eC7i7H0grhRH4pakLc9jSOww2GpU2OTq2nq/626617250.png?crop=1%3A1",
    "level": "member",
    "state": "active",
    "contributorName": "2z42css3dgvoi"
},
{
    "createdDate": "2010-09-08T02:57:00.225Z",
    "fullName": "Robert Calabrese",
    "gender": "m",
    "location": "Baltimore, MD",
    "country": "US",
    "zip": "21284",
    "birthdate": "1989-09-29",
    "email": "rcalab2@xxx.edu",
    "profilePhoto": "http://api.ning.com:80/files/251IcCtIBC3dGALHpG3ruYfg0Ip*EFJApPyMVGkiVArSUEvF*dK8A5grvPvl8eC7i7H0grhRH4pakLc9jSOww2GpU2OTq2nq/626617250.png?crop=1%3A1",
    "level": "member",
    "state": "active",
    "contributorName": "199ru4hzwc4n4"
},
{
    "createdDate": "2010-09-04T22:36:51.158Z",
    "fullName": "Regis Bamba",
    "gender": "m",
    "location": "Baltimore, MD",
    "country": "US",
    "zip": "21210",
    "birthdate": "1986-09-29",
    "email": "rbamba2xxx.edu",
    "profilePhoto": "http://api.ning.com:80/files/251IcCtIBC3dGALHpG3ruYfg0Ip*EFJApPyMVGkiVArSUEvF*dK8A5grvPvl8eC7i7H0grhRH4pakLc9jSOww2GpU2OTq2nq/626617250.png?crop=1%3A1",
    "level": "member",
    "state": "active",
    "contributorName": "2seadgzt89n6x"
},

【问题讨论】:

  • 请显示您当前的解析代码。

标签: c# json json.net


【解决方案1】:

类似:

JArray root = JArray.Load(reader);
foreach(JObject o in root)
{
    ct += "\r\n\r\n<tr><td>" + (string)o["fullName"] + "</td>";
    ct += "<td>" + (string)o["contributorName"] + "</td>";
    ct += "<td>" + (string)o["email"] + "</td>";
}

我们使用显式转换从JObject.Item 返回的JToken 中获取字符串值。

但是,为了提高性能,您应该考虑使用StringBuilder,而不是串联。

【讨论】:

  • 太棒了!这就是 LINQ 可以为我做的吗?
  • @Caveatrob,LINQ to JSON 的灵感来自 LINQ,它可以与 LINQ to Objects 一起使用。但是,它不是 LINQ 提供程序,我的回答没有使用任何 LINQ 功能。
猜你喜欢
  • 1970-01-01
  • 2014-08-05
  • 2014-02-08
  • 1970-01-01
  • 1970-01-01
  • 2020-03-23
  • 1970-01-01
  • 2015-09-06
  • 1970-01-01
相关资源
最近更新 更多