我在使用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,用户名,事件名称,事件日期。
在此先感谢您为解决该问题提供的帮助。
答案 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
访问“用户”列表,您可以循环访问以获取应用程序所需的任何数据。