在C#中将JSON对象列表反序列化为POCO对象

4
我正在调用一个返回JSON序列化对象列表的服务,例如此类:
{"employees":[{"employee":{"id":"1","date_created":"2011-06-16T15:03:27Z","extended":[{"address":{"street1":"12345 first st.","city":"Denver","state":"CO"}}]}},{"employee":{"id":"2"...
如您所见,我首先有一个名为employees的员工对象列表。除此之外,每个员工对象都包含另一个名为extended的对象,以获取扩展信息(在本例中是地址信息)。我想要实现的是将整个列表作为字符串传递给反序列化器,并返回一个Employee对象的List,该对象看起来像这样:
[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!
1个回答

4

好的,这里有几件事情:

  • 你有一个外部“包装器”级别或两个级别,将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。


像往常一样出色。正是我所需要的。 - RockyMountainHigh
为什么要构建一个JsonSerializer呢? - Jordan
@Jordan:不知道我为什么那样做了 - 现在已经删除 :) - Jon Skeet
没问题。我只是真的很好奇,以为这可能是什么东西。谢谢。 - Jordan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接