将列表序列化为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(); 

我不知道是否可以用JavascriptSerializerreplace这种危险的代码,并得到相同的结果。 我将如何做到这一点?

谢谢。

 // you need to reference System.Web.Extensions using System.Web.Script.Serialization; var jsonSerialiser = new JavaScriptSerializer(); var json = jsonSerialiser.Serialize(aList); 

请注意:

时代已经改变,我会默认使用JSON.Net作为我的第一selectJSONparsing器。 如果它是WebAPI的正确select,那对我来说是正确的select。

例如

 using Newtonsoft.Json; var json = JsonConvert.SerializeObject(aList); 

您可能需要先安装软件包。

 PM> Install-Package Newtonsoft.Json 

有关更多详细信息, 请参阅并提供作为此信息源的答案 。

你也可以使用Json.NET。 只需在http://james.newtonking.com/pages/json-net.aspx下载它,提取压缩文件并将其添加为参考。;

然后,只需序列化列表(或任何你想要的对象)与以下内容:

 using Newtonsoft.Json; string json = JsonConvert.SerializeObject(listTop10); 

更新:您也可以通过NuGet包pipe理器(工具 – > NuGet包pipe理器 – >包pipe理器控制台)将其添加到您的项目中:

 PM> Install-Package Newtonsoft.Json 

文档: 序列化集合

使用内置的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;} } 

.NET已经通过System.Runtime.Serialization.Json命名空间和DataContractJsonSerializer类从3.5版开始支持基本的Json序列化。 顾名思义,DataContractJsonSerializer会考虑添加到对象中的任何数据注释以创build最终的Json输出。

如果您已经有了要将Json序列化为stream的带注释的数据类,那么可以很方便,如“ 如何:序列化和反序列化JSON数据”中所述 。 有一些限制,但如果您有基本的需求,并且不想将另一个库添加到您的项目,那么它就足够好,足够快。

以下代码将一个列表序列化为控制台输出stream。 正如你所看到的,它比Json.NET更冗长,而不是types安全的(即没有generics)

  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类,格式化date到JSON等。

另一种select是ServiceStack.Text ,它是ServicStack … stack的一部分,它为Json,JSV和CSV提供了一组非常快速的序列化程序。

 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; }