Десериализация списка объектов json в объекты POCO в C # - PullRequest
4 голосов
/ 17 июня 2011

Я звоню серверу, который возвращает список сериализованных объектов jso, например:

{ "сотрудники": [{ "служащий": { "ID": "1", "date_created": "2011-06-16T15: 03: 27Z", "расширенная": [{ "адрес": { "street1": "12345 first st.", "city": "Denver", "state": "CO"}}]}}, {"employee": {"id": "2" ...

Итак, вы можете видеть, что у меня есть список объектов сотрудников, называемых сотрудниками. Вдобавок ко всему, каждый объект сотрудника содержит другой объект, называемый расширенный для расширенной информации (в данном случае адресной информации). То, что я хотел бы получить, это передать весь список в виде строки десериализатору и получить обратно список с объектом 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, но они не совсем одинаковы с точки зрения составного объекта. При необходимости я могу отказаться от расширенных свойств. Но это было бы далеко от идеала.

Любая помощь будет принята с благодарностью.

ТИА!

1 Ответ

4 голосов
/ 17 июня 2011

Что ж, здесь есть несколько вещей:

  • У вас есть один или два внешних уровня «обертки», которые отображают свойство 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...