Как преобразовать строку json в граф объектов (.NET) - CodeHelper

Как преобразовать строку json в граф объектов (.NET)

2

Как оптимальнее преобразовать строку JSON в граф (наверное, анонимных) объектов .NET? Есть ли для этого специальные библиотеки?

Новые ответы


1

Можно использовать библиотеку Json.NET. Эта библиотека позволяет парсить json в двух режимах:

  • используя JSON serializer;
  • используя LINQ to JSON.

JSON serializer работает так же как стандартный JavaScriptSerializer. То есть нужно определить классы модели в соответствии с данными в JSON-строке и затем вызывать метод десериализации:

Product product = JsonConvert.DeserializeObject<Product>(jsonData);

У такого подхода есть недостаток — поля в строке JSON могут отличаться по нотации от C#-кода. Например, если в JSON есть поле product_id, то в C#-классе придется создать свойство с именем Product_id, хотя правильным считается имя ProductId. Кроме того, в JSON может быть записан сложный граф объектов, и создавать все эти объекты в C# очень утомительно. Поэтому Json.NET поддерживает LINQ TO JSON — возможность считывания данных из части строки без полного преобразования в граф объектов. Работает это примерно так:

JObject o = JObject.Parse(json);
var titles = 
    from p in rss["field1"]["field1"].Children()
    select (string)p["title"];

Здесь объект класса JObject содержит анонимные данные из JSON-строки.

Также Json.NET поддерживает различные способы обратного парсинга — из .NET объектов в JSON-строку.

2

Можно использовать объект класса JavaScriptSerializer, который включен в .NET 3.5 Sp 1 (пространство имен System.Web.Script.Serialization, сборка System.Web.Extensions). Этот объект преобразует строку JSON в граф объектов. Соответственно, для всей структуры JSON должны быть объявлены C#-классы с одноименными свойствами или полями. Например, имеем такой JSON:

{
    "name": "category_name",
    "description": "some description",
    "products": [
        {"name": "product1", "id": "p1"},
        {"name": "product2", "id": "p2"}
    ]
}

Для преобразования такой строки в объекты нужно объявить классы:

public class Product 
{
    public string Id { get; set; }

    public string Name { get; set; }
}

public class Category 
{
    public string Name { get; set; }

    public string Description { get; set; }

    public IList<Product> Products { get; set; }
}

Теперь для преобразования JSON в граф можно выполнить код:

var serializer = new JavaScriptSerializer();
var data = serializer.Deserialize<Category>(jsonString);

v1.7.123.556
© 2009—2010 CodeHelper FAQ | О сайте | Обратная связь | История изменений | Статьи
Creative Commons LicenseМатериалы сайта распространяются под лицензией Creative Commons Attribution-Share Alike 3.0 Unported.