2012-02-02 5 views
115

У меня есть объектная модель, которая выглядит следующим образом:Сериализация списка 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 и получить те же результаты. Как мне это сделать?

Спасибо.

ответ

220
// 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 

Для получения более подробной информации see and upvote the answer that is the source of this information.

+1

ah ok, он ТАКЖЕ сериализует списки объектов, а не только сами объекты. Благодарю. – frenchie

+0

не любит циклические отношения, но это не проблема. – Jodrell

+12

Обратите внимание, что это пространство имен уклонилось в System.Web.Extensions. Как только вы добавите это в качестве ссылки, решение работает блестяще! –

9

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

  1. JavaScriptSerializer

    var serializer = new JavaScriptSerializer(); 
    return serializer.Serialize(TheList); 
    
  2. 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;} 
    } 
    
3

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

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

Следующий код serializea представляет собой список выходных потоков консоли. Как вы видите, это бит более подробный, чем 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.

81

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

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

using Newtonsoft.Json; 

string json = JsonConvert.SerializeObject(listTop10); 

Update: вы можете добавить его в свой проект с помощью NuGet Package Manager (Tools -> NuGet Package Manager -> Package Manager Console):

PM> Install-Package Newtonsoft.Json 

Документация: Serializing Collections

+6

или использовать nuget http://www.nuget.org/packages/newtonsoft.json/ – Jodrell

2
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; 
     } 
Смежные вопросы