【问题标题】:Deserialize JSON with Newtonsoft使用 Newtonsoft 反序列化 JSON
【发布时间】:2019-12-19 20:42:39
【问题描述】:

我在使用此 JSON 时遇到问题,无法在组合框和 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、用户名、事件名称、事件日期。

提前感谢您为解决问题提供的任何帮助。

【问题讨论】:

  • JsonConvert.DeserializeObject&lt;Admin&gt;(json); 呢?
  • @Twenty 是正确的,然后您的jResponse 将填充Users,然后您可以使用它。此外,Upgraded 不存在于 Admin 中,您将在那里遇到异常。
  • 您需要反序列化数据的帮助,还是想知道如何将您的类用作 ComboBox 或 DataGrid 数据源?
  • @Çöđěxěŕ > So far the only time I've worked with this has been for a much simpler topic like this。我的意思是,这不是 100% 的保证,但很有可能。
  • @Twenty 好点,不确定;这绝对是一种可能。

标签: c# json winforms json.net


【解决方案1】:

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

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

如果 JSON 数组 Users 没有嵌套在另一个对象中,如果它是 Admin 类的唯一属性,您也可以将其转换为 List&lt;User&gt;HashSet 或类似的集合也应该工作)。这看起来像这样:

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 中的所有用户名。

【讨论】:

  • 谢谢@Twenty。最后看起来像这样:CboEvents.DataSource = jResponse.Users.SelectMany(x =&gt; x.Events.OrderBy(y =&gt; y.Id).Select(y =&gt; new { y.Id, y.Name })).ToList();Linq 这对我来说是新的,我不太明白 x 和 y 是,但它有效。
  • 我将反序列化更改为 因为只有 不起作用并且 SelectMany 结果得到一个列表
【解决方案2】:

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

var AdminObj = JsonConvert.DeserializeObject&lt;Admin&gt;(json);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多