如何解析多态JSON数组?

我有一个JSON格式的文件,包含个人用户的记录。 一些用户的记录中间有一个注释字段。 我只想解析顶级项目(fullName contributorName email)

使用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 += ""; while (reader.Read()) { if (reader.TokenType == JsonToken.PropertyName) { if (reader.Value.ToString() == "fullName") { reader.Read(); ct += "\r\n\r\n"; } if (reader.Value.ToString() == "contributorName") { reader.Read(); ct += ""; } if (reader.Value.ToString() == "email") { reader.Read(); ct += ""; } } } } catch { } ct+="
" + reader.Value + "" + reader.Value + "
" + reader.Value + "
"; namesText.Text = ct;

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

 [ { "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" }, 

就像是:

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

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

但是,您应该考虑使用StringBuilder而不是连接来提高性能。