使用Newtonsoft反序列化JSON

时间:2019-12-19 20:42:39

标签: c# json winforms json.net

我在使用JSON时遇到问题,无法在combobox和datagridview中使用它。我正在使用Newtonsoft:

{
    "users": [
        {
            "id": 1,
            "name": "Test 1",
            "email": "test1@test.com",
            "events": [
                {
                    "id": 1,
                    "name": "Event 1",
                    "date": "11/10/2019",
                    "finish": 0

                },
                {
                    "id": 2,
                    "name": "Event 2",
                    "date": "12/10/2019",
                    "finish": 0
                }
            ]
        },
        {
            "id": 2,
            "name": "Test 2",
            "email": "test2@test.com",
            "events": [
                {
                    "id": 2,
                    "name": "Event 2",
                    "date": "17/10/2019",
                    "finish": 0
                }
            ]
        }
    ]
}

这是类(JsonEvent.cs)。用json2csharp.com生成:

using System;
using System.Collections.Generic;

namespace TestDO.Models
{
    class JsonEvent
    {
        public partial class Admin
        {
            public List<User> Users { get; set; }
        }

        public partial class User
        {
            public long Id { get; set; }
            public string Name { get; set; }
            public string Email { get; set; }
            public List<Event> Events { get; set; }
        }

        public partial class Event
        {
            public long Id { get; set; }
            public string Name { get; set; }
            public string Date { get; set; }
            public long Finish { get; set; }
        }
    }
}

但是现在,我不知道如何将结果用于组合框数据源或数据网格。

到目前为止,我唯一一次使用这样的主题是(这是示例,与之无关): JsonResponde.cs

namespace TestDO.Models
{
    class JsonResponse
    {
        public string Upgraded { get; set; }
        public string time{ get; set; }
    }
}

然后我检查升级结果,如下所示:

var jResponse = JsonConvert.DeserializeObject<JsonResponse>(json);
if (jResponse.Upgraded == "true")

但是我不知道如何使用更复杂的json。

我想使用事件ID作为组合框,使用事件名称作为显示。

对于数据网格,每行的用户ID,用户名,事件名称,事件日期。

在此先感谢您为解决该问题提供的帮助。

2 个答案:

答案 0 :(得分:4)

您提供的JSON的C#表示似乎完美且匹配。因此,您应该可以执行以下操作:

var jResponse = JsonConvert.DeserializeObject<Admin>(json);

如果JSON数组Users没有嵌套在另一个对象中,那么它也可以转换为List<User>HashSet或类似的集合也可以工作),如果它是您的Admin类。看起来像这样:

var jResponse = JsonConvert.DeserializeObject<List<User>>(json);

要使其正常工作,您的JSON需要看起来像这样:

[
    {
        "id": 1,
        "name": "Test 1",
        "email": "test1@test.com",
        "events": [
            {
                "id": 1,
                "name": "Event 1",
                "date": "11/10/2019",
                "finish": 0

            },
            {
                "id": 2,
                "name": "Event 2",
                "date": "12/10/2019",
                "finish": 0
            }
        ]
    },
    {
        "id": 2,
        "name": "Test 2",
        "email": "test2@test.com",
        "events": [
            {
                "id": 2,
                "name": "Event 2",
                "date": "17/10/2019",
                "finish": 0
            }
        ]
    }
]

编辑

如果要将用户提供给组合框,则只需将列表传递给组合框即可。请参见下面的示例:

ComboBox cb = new ComboBox();

cb.DataSource = jResponse.Users.SelectMany(x => x.Events.OrderBy(y => y.Id).Select(y => y.Name));

当然,您的Users对象包含很多信息,这只是一个假设,您希望在ComboBox中拥有所有用户名。

答案 1 :(得分:0)

您需要将json反序列化为您创建的Admin类的对象,您可以这样做:

var AdminObj = JsonConvert.DeserializeObject<Admin>(json);

在这里,您可以通过AdminObj.Users访问“用户”列表,您可以循环访问以获取应用程序所需的任何数据。