Как оптимальнее преобразовать строку JSON в граф (наверное, анонимных) объектов .NET? Есть ли для этого специальные библиотеки?
Как преобразовать строку json в граф объектов (.NET)
Новые ответы
Можно использовать библиотеку 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-строку.
Можно использовать объект класса 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);