gpt4 book ai didi

c# - 在 C# 中将 json 对象列表反序列化为 POCO 对象

转载 作者:太空狗 更新时间:2023-10-30 01:25:42 25 4
gpt4 key购买 nike

我正在调用一个返回 jso 序列化对象列表的服务,例如:

{“员工”:[{“员工”:{“id”:“1”,“date_created”:“2011-06-16T15:03:27Z”,“扩展”:[{“地址”:{ "street1":"12345 first st.","city":"Denver","state":"CO"}}]}},{"employee":{"id":"2"...

因此,您可以看到我首先有一个名为 employees 的员工对象列表。最重要的是,每个员工对象都包含另一个名为 extended 的对象,用于扩展信息(在本例中为地址信息)。我想要实现的是将整个列表作为字符串传递给反序列化器,然后返回一个带有 Employee 对象的列表,如下所示:

[Serializable]
public class Employee {
public string Id { get; set; }
public string DateCreated { get; set; }
public ExtendedProperties Address { get; set; }
}

[Serializable]
public class ExtendedProperties
{
public string Street1 { get; set; }
public string City { get; set; }
public string State { get; set; }
}

我使用 NEwtonSoft 找到了类似的示例,但它们在复合对象方面并不完全相同。如果需要,我可以删除扩展属性。但这远非理想。

如有任何帮助,我们将不胜感激。

TIA!

最佳答案

好吧,这里有几件事:

  • 您有一个或两个外部“包装器”级别,将 employees 属性映射到实际的属性集合。您可以使用单独的类来处理它,也可以使用 LINQ to JSON 读取整个内容,然后在反序列化集合之前深入一层。
  • 看起来您实际上已经为每位员工集合扩展属性,扩展属性中的一个属性是地址。
  • 我不确定如何说服 JSON 库将 date_created 转换为 DateCreated,尽管我敢说它可以。

我已经破解了一些东西来阅读这个 - 但它有点难看:

using System;
using System.Collections.Generic;
using System.IO;

using Newtonsoft.Json;

public class EmployeeCollection {
public List<EmployeeWrapper> Employees { get; set; }
}

public class EmployeeWrapper {
public Employee Employee { get; set; }
}

public class Employee {
public string Id { get; set; }
public string Date_Created { get; set; }
public List<ExtendedProperty> Extended { get; set; }
}

public class ExtendedProperty {
public Address Address { get; set; }
}

public class Address
{
public string Street1 { get; set; }
public string City { get; set; }
public string State { get; set; }
}

class Test
{
static void Main()
{
string json = @"{""employees"":
[{""employee"":
{""id"":""1"",
""date_created"":""2011-06-16T15:03:27Z"",
""extended"":[
{""address"":
{""street1"":""12345 first st."",
""city"":""Denver"",
""state"":""CO""}}]
}}]}";


var employees =
JsonConvert.DeserializeObject<EmployeeCollection>(json);
foreach (var employeeWrapper in employees.Employees)
{
Employee employee = employeeWrapper.Employee;
Console.WriteLine("ID: {0}", employee.Id);
Console.WriteLine("Date created: {0}", employee.Date_Created);
foreach (var prop in employee.Extended)
{
Console.WriteLine("Extended property:");
Address addr = prop.Address;
Console.WriteLine("{0} / {1} / {2}", addr.Street1,
addr.City, addr.State);
}
}
}
}

如果您想保留您的原始类结构,我建议您使用 LINQ to JSON 进行更手动的转换。当您习惯了 JSON 库时,这并不难——尤其是当您对 LINQ to Objects 感到满意时。

关于c# - 在 C# 中将 json 对象列表反序列化为 POCO 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6388315/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com