Поиск…


замечания

JavaScriptSerializer против Json.NET

Класс JavaScriptSerializer был введен в .NET 3.5 и используется внутренне асинхронным уровнем связи .NET для приложений с поддержкой AJAX. Он может использоваться для работы с JSON в управляемом коде.

Несмотря на существование класса JavaScriptSerializer , Microsoft рекомендует использовать библиотеку Json.NET с открытым исходным кодом для сериализации и десериализации. Json.NET обеспечивает более высокую производительность и более дружественный интерфейс для отображения JSON на пользовательские классы (пользовательские JavaScriptConverter объект будет нужно сделать то же самое с JavaScriptSerializer ).

Десериализация с использованием System.Web.Script.Serialization.JavaScriptSerializer

Метод JavaScriptSerializer.Deserialize<T>(input) пытается десериализовать строку допустимого JSON в объект указанного типа <T> , используя сопоставления по умолчанию, поддерживаемые JavaScriptSerializer .

using System.Collections;
using System.Web.Script.Serialization;

// ...

string rawJSON = "{\"Name\":\"Fibonacci Sequence\",\"Numbers\":[0, 1, 1, 2, 3, 5, 8, 13]}";

JavaScriptSerializer JSS = new JavaScriptSerializer(); 
Dictionary<string, object> parsedObj = JSS.Deserialize<Dictionary<string, object>>(rawJSON);

string name = parsedObj["Name"].toString();
ArrayList numbers = (ArrayList)parsedObj["Numbers"]

Примечание. Объект JavaScriptSerializer был представлен в версии .NET 3.5.

Десериализация с использованием Json.NET

internal class Sequence{
    public string Name;
    public List<int> Numbers;
}    

// ...

string rawJSON = "{\"Name\":\"Fibonacci Sequence\",\"Numbers\":[0, 1, 1, 2, 3, 5, 8, 13]}";

Sequence sequence = JsonConvert.DeserializeObject<Sequence>(rawJSON);

Для получения дополнительной информации см. Официальный сайт Json.NET .

Примечание. Json.NET поддерживает .NET версии 2 и выше.

Сериализация с использованием Json.NET

[JsonObject("person")]
public class Person
{
    [JsonProperty("name")]
    public string PersonName { get; set; }
    [JsonProperty("age")]
    public int PersonAge { get; set; }
    [JsonIgnore]
    public string Address { get; set; }
}

Person person = new Person { PersonName = "Andrius", PersonAge = 99, Address = "Some address" };
string rawJson = JsonConvert.SerializeObject(person);

Console.WriteLine(rawJson); // {"name":"Andrius","age":99}

Обратите внимание, что свойства (и классы) могут быть украшены атрибутами, чтобы изменить их внешний вид в результирующей строке json или вообще удалить их из json-строки (JsonIgnore).

Более подробную информацию о атрибутах сериализации Json.NET можно найти здесь .

В C # общедоступные идентификаторы записываются в PascalCase по соглашению. В JSON соглашение заключается в использовании camelCase для всех имен. Вы можете использовать контрактный преобразователь для преобразования между ними.

using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    [JsonIgnore]
    public string Address { get; set; }
}

public void ToJson() {
    Person person = new Person { Name = "Andrius", Age = 99, Address = "Some address" };
    var resolver = new CamelCasePropertyNamesContractResolver();
    var settings = new JsonSerializerSettings { ContractResolver = resolver };
    string json = JsonConvert.SerializeObject(person, settings);

    Console.WriteLine(json); // {"name":"Andrius","age":99}
}

Сериализация-десериализация с использованием Newtonsoft.Json

В отличие от других помощников, этот использует помощники статического класса для сериализации и десериализации, поэтому он немного проще, чем другие.

using Newtonsoft.Json;

var rawJSON      = "{\"Name\":\"Fibonacci Sequence\",\"Numbers\":[0, 1, 1, 2, 3, 5, 8, 13]}";
var fibo         = JsonConvert.DeserializeObject<Dictionary<string, object>>(rawJSON);
var rawJSON2     = JsonConvert.SerializeObject(fibo);

Динамическое связывание

Json.NET от Newtonsoft позволяет вам динамически связывать json (используя объекты ExpandoObject / Dynamic) без необходимости явно создавать тип.

Сериализация

dynamic jsonObject = new ExpandoObject();
jsonObject.Title   = "Merchent of Venice";
jsonObject.Author  = "William Shakespeare";
Console.WriteLine(JsonConvert.SerializeObject(jsonObject));

Десериализация

var rawJson = "{\"Name\":\"Fibonacci Sequence\",\"Numbers\":[0, 1, 1, 2, 3, 5, 8, 13]}";
dynamic parsedJson = JObject.Parse(rawJson);
Console.WriteLine("Name: " + parsedJson.Name);
Console.WriteLine("Name: " + parsedJson.Numbers.Length);

Обратите внимание, что ключи в объекте rawJson были превращены в переменные-члены в динамическом объекте.

Это полезно в тех случаях, когда приложение может принимать / производить различные форматы JSON. Тем не менее предлагается использовать дополнительный уровень проверки для строки Json или динамического объекта, сгенерированного в результате сериализации / де-сериализации.

Сериализация с использованием Json.NET с настройками JsonSerializerSettings

Этот сериализатор имеет некоторые приятные функции, которые не имеет сериализатора по умолчанию .net json serializer, например обработка нулевого значения, вам просто нужно создать JsonSerializerSettings :

public static string Serialize(T obj)
{
   string result = JsonConvert.SerializeObject(obj, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore});
   return result;
}

Еще одна серьезная проблема с сериализатором в .net - это цикл саморегуляции. В случае учащегося, участвующего в курсе, его экземпляр имеет свойство курса, а курс имеет набор учеников, что означает List<Student> который создаст опорный цикл. Вы можете справиться с этим с помощью JsonSerializerSettings :

public static string Serialize(T obj)
{
   string result = JsonConvert.SerializeObject(obj, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore});
   return result;
}

Вы можете поместить следующий вариант сериализации следующим образом:

public static string Serialize(T obj)
{
   string result = JsonConvert.SerializeObject(obj, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, ReferenceLoopHandling = ReferenceLoopHandling.Ignore});
   return result;
}


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow