Сериализация списка JSON

У меня есть объектная модель, которая выглядит так:

public MyObjectInJson
{
   public long ObjectID {get;set;}
   public string ObjectInJson {get;set;}
}

Свойство ObjectInJson является уже сериализованной версией объекта, который содержит вложенные списки. На данный момент я сериализую список MyObjectInJson вручную следующим образом:

StringBuilder TheListBuilder = new StringBuilder();

TheListBuilder.Append("[");
int TheCounter = 0;

foreach (MyObjectInJson TheObject in TheList)
{
  TheCounter++;
  TheListBuilder.Append(TheObject.ObjectInJson);

  if (TheCounter != TheList.Count())
  {
    TheListBuilder.Append(",");
  }
}
TheListBuilder.Append("]");

return TheListBuilder.ToString();

Интересно, могу ли я заменить этот вид опасного кода на JavascriptSerializer и получить те же результаты. Как мне это сделать?

Спасибо.

Ответ 1

// you need to reference System.Web.Extensions

using System.Web.Script.Serialization;

var jsonSerialiser = new JavaScriptSerializer();
var json = jsonSerialiser.Serialize(aList);

Обратите внимание:

Времена изменились, я по умолчанию использовал бы JSON.Net в качестве своего первого выбора JSON Parser. Если это правильный выбор для WebAPI, это правильный выбор для меня.

например.

using Newtonsoft.Json;

var json = JsonConvert.SerializeObject(aList);

вам может потребоваться сначала установить пакет.

PM> Install-Package Newtonsoft.Json

Подробнее о см. и подтвердите ответ, являющийся источником этой информации.

Ответ 2

Вы также можете использовать Json.NET. Просто скачайте его на http://james.newtonking.com/pages/json-net.aspx, извлеките сжатый файл и добавьте его в качестве ссылки.

Затем просто выполните сериализацию списка (или любого другого объекта, который вы хотите) со следующим:

using Newtonsoft.Json;

string json = JsonConvert.SerializeObject(listTop10);

Обновление: вы также можете добавить его в свой проект через диспетчер пакетов NuGet (Инструменты → Диспетчер пакетов NuGet → Консоль диспетчера пакетов):

PM> Install-Package Newtonsoft.Json

Документация: Сериализация коллекций

Ответ 3

Существует два общих способа сделать это со встроенными сериализаторами JSON:

  • JavaScriptSerializer

    var serializer = new JavaScriptSerializer();
    return serializer.Serialize(TheList);
    
  • DataContractJsonSerializer

    var serializer = new DataContractJsonSerializer(TheList.GetType());
    using (var stream = new MemoryStream())
    {
        serializer.WriteObject(stream, TheList);
        using (var sr = new StreamReader(stream))
        {
            return sr.ReadToEnd();
        }
    }
    

    Обратите внимание, что для этой опции требуется определение контракта данных для вашего класса:

    [DataContract]
    public class MyObjectInJson
    {
       [DataMember]
       public long ObjectID {get;set;}
       [DataMember]
       public string ObjectInJson {get;set;}
    }
    

Ответ 4

.NET уже поддерживает базовую сериализацию Json через пространство имен System.Runtime.Serialization.Json и DataContractJsonSerializer с версии 3.5. Как следует из названия, DataContractJsonSerializer учитывает любые аннотации данных, которые вы добавляете к своим объектам для создания окончательного вывода Json.

Это может быть удобно, если у вас уже есть аннотированные классы данных, которые вы хотите сериализовать Json для потока, как описано в How To: Сериализация и десериализация данных JSON. Существуют ограничения, но это достаточно хорошо и достаточно быстро, если у вас есть основные потребности и вы не хотите добавлять еще одну библиотеку в свой проект.

Следующий код сериализует список для потока вывода консоли. Как вы видите, это немного более многословный, чем Json.NET, а не безопасный тип (т.е. Не дженерики)

        var list = new List<string> {"a", "b", "c", "d"};

        using(var output = Console.OpenStandardOutput())                
        {                
            var writer = new DataContractJsonSerializer(typeof (List<string>));
            writer.WriteObject(output,list);
        }

С другой стороны, Json.NET обеспечивает гораздо лучший контроль над тем, как вы создаете Json. Это придет очень ОЧЕНЬ удобно, когда вам нужно сопоставить имена имен, удобных для javascript, для классов .NET, даты форматирования для json и т.д.

Другим вариантом является ServiceStack.Text, часть ServicStack..., который обеспечивает набор очень быстрых сериализаторов для Json, JSV и CSV.

Ответ 5

public static string JSONSerialize<T>(T obj)
        {
            string retVal = String.Empty;
            using (MemoryStream ms = new MemoryStream())
            {
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
                serializer.WriteObject(ms, obj);
                var byteArray = ms.ToArray();
                retVal = Encoding.UTF8.GetString(byteArray, 0, byteArray.Length);
            }
            return retVal;
        }