代码之家  ›  专栏  ›  技术社区  ›  Caveatrob

如何解析多态JSON数组?

  •  3
  • Caveatrob  · 技术社区  · 15 年前

    全名 出资人姓名 电子邮件)

    使用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;
    

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

    [
    {
        "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"
    },
    
    1 回复  |  直到 12 年前
        1
  •  9
  •   Matthew Flaschen    15 年前

    比如:

    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 .

    StringBuilder ,而不是串联,以提高性能。