如何反序列化Fixture JSON?

时间:2015-06-22 11:49:03

标签: c# json

我正在尝试反序列化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,我很高兴看到它!

1 个答案:

答案 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) { ... }