我正在尝试反序列化this json。 首先,我使用json2charp来创建类。 但是,我不确定生成的类在这种情况下是否正确。 但是我提出了一个Http请求:
public string Request(string requestUrl)
{
HttpWebRequest request = WebRequest.Create(requestUrl) as HttpWebRequest;
request.Method = "GET";
request.ContentType = "application/json";
string responseText;
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
using (var responseStream = new StreamReader(response.GetResponseStream()))
{
responseText = responseStream.ReadToEnd();
}
return responseText;
}
使用此函数,我从JSON传递反序列化的链接,然后我将返回带有响应的字符串。 此时我将响应保存到变量中:
string responseText = parser.Request(requestUrl);
然后创建一个对象,其中包含先前使用工具json2csharp生成的RootObject中定义的参数列表。 问题是foreach不接受该项,说没有GetEnumerator的定义。
var obj = JsonConvert.DeserializeObject<Fixtures.RootObject>(responseText);
foreach (var element in obj) //this insert the value into a Datagrid.
{
MainWindow.AppWindow.Fixtures_Table.Items.Add(new Fixtures.Fixture
{
date = element.date;
etc...
});
}
json结构:
fixture:": {
"_links": {
"self": {
"href": "http://api.football-data.org/alpha/fixtures/133566"
},
"soccerseason": {
"href": "http://api.football-data.org/alpha/soccerseasons/347"
},
"homeTeam": {
"href": "http://api.football-data.org/alpha/teams/556"
},
"awayTeam": {
"href": "http://api.football-data.org/alpha/teams/514"
}
},
"date": "2013-10-04T22:00:00Z",
"matchday": 10,
"homeTeamName": "Nimes Olympique",
"awayTeamName": "SM Caen",
"result": {
"goalsHomeTeam": 2,
"goalsAwayTeam": 1
}
},
"head2head": {
"count": 10,
"timeFrameStart": "2014-05-12T22:00:00Z",
"timeFrameEnd": "2000-09-29T22:00:00Z",
"homeTeamWins": 1,
"awayTeamWins": 5,
"draws": 4,
"lastHomeWinHomeTeam": { },
"lastWinHomeTeam": { },
"lastAwayWinAwayTeam": { },
"lastWinAwayTeam": { },
"fixtures": [ ]
}
}
所以我想知道我做错了什么,以及生成的类是否好。 如果其他人能够更加智能和有效地反序列化JSON,我很高兴看到它!
答案 0 :(得分:0)
没有枚举器,因为你的JSON只是对象而不是数组,因此除非你遍历键来获取值,否则没有什么可以真正迭代。因此,我希望Fixtures.RootObject不是实现IEnumerable的东西。如果生成的RootObject跟随你的json,我希望以下工作:
foreach (var element in obj.head2head.fixtures) { ... }
如果没有,我会查看json.net并将json反序列化为动态或匿名对象,以使用上面的符号。
var obj = JsonConvert.DeserializeObject<dynamic>(responseText);
foreach (var element in obj.head2head.fixtures) { ... }