【问题标题】:How to deserialize a Fixture JSON?如何反序列化 Fixture JSON?
【发布时间】:2015-06-22 11:49:02
【问题描述】:

我正在尝试反序列化 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不会接受item,说没有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,我很乐意阅读!

【问题讨论】:

    标签: c# json


    【解决方案1】:

    没有枚举器,因为您的 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) { ... }
    

    【讨论】:

    • 是的,我已经在使用 Json.net。那么json2csharp生成的类好不好?我已经用 json 的完整结构更新了问题
    • 您能发布您生成的课程吗?我们只是基于 JSON 假设该类的外观,但确实需要知道才能为您提供更好的答案。
    • 好的,我把完整的类贴到了pastebin,因为类太长了:pastebin.com/ceW98QV8
    • 第一个代码示例应该可以正常工作 (foreach (var element in obj.head2head.fixtures) { ... }) - 只需确保您根据粘贴类中的 Fixture2 类型引用元素的属性。
    • @HaroldFinch,这个答案/cmets 能帮助你吗?如果是这样,请随时投票/接受。我很乐意详细说明任何细节。
    猜你喜欢
    • 1970-01-01
    • 2014-02-27
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多