2012-02-02 47 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解析器。如果它是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

好的,它也可以序列化对象列表,而不仅仅是对象本身。谢谢。 – frenchie 2012-02-02 10:48:39

+0

doesen't不像循环关系,但这不是一个问题 – Jodrell 2012-02-02 10:53:12

+12

请注意,这个命名空间是狡猾地藏在System.Web.Extensions中。一旦您将其作为参考添加,该解决方案出色! – 2013-05-09 16:25:08

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已经支持通过System.Runtime.Serialization.Json namespace和基本的JSON序列化自3.5版本DataContractJsonSerializer类。顾名思义,DataContractJsonSerializer会考虑添加到对象中的任何数据注释以创建最终的Json输出。

如果您已经有注释的数据类,并且想要将Json序列化为流,那么这很方便,如How To: Serialize and Deserialize JSON Data中所述。有一些限制,但如果您有基本需求并且不想将另一个库添加到您的项目中,它就足够好并且足够快。

以下代码将列表序列化为控制台输出流。正如你所看到的,它是一个比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); 

更新:您还可以将其通过NuGet包管理器添加到您的项目(工具 - > NuGet包管理器 - >软件包管理器控制台):

PM> Install-Package Newtonsoft.Json 

文档:Serializing Collections

+6

或使用nuget http://www.nuget.org/packages/newtonsoft.json/ – Jodrell 2013-12-03 10:20:26

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