将列表序列化为JSON

fre*_*hie 171 c# asp.net json

我有一个如下所示的对象模型:

public MyObjectInJson
{
   public long ObjectID {get;set;}
   public string ObjectInJson {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

该属性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();
Run Code Online (Sandbox Code Playgroud)

我想知道我是否可以替换这种危险的代码JavascriptSerializer并得到相同的结果.我该怎么做?

谢谢.

Jod*_*ell 313

using System.Text.Json;

var json = JsonSerializer.Serialize(aList);
Run Code Online (Sandbox Code Playgroud)

请注意:

时代已经改变,我默认使用JSON.Net作为我的首选JSON Parser.如果它是WebAPI的正确选择,它对我来说是正确的选择.

例如

using Newtonsoft.Json;

var json = JsonConvert.SerializeObject(aList);
Run Code Online (Sandbox Code Playgroud)

您可能需要先安装包.

PM> Install-Package Newtonsoft.Json
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,此命名空间在System.Web.Extensions中狡猾地隐藏起来.一旦您将其添加为参考,该解决方案就会非常出色! (13认同)

Bre*_*ata 109

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

然后使用以下命令序列化列表(或任何您想要的对象):

using Newtonsoft.Json;

string json = JsonConvert.SerializeObject(listTop10);
Run Code Online (Sandbox Code Playgroud)

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

PM> Install-Package Newtonsoft.Json
Run Code Online (Sandbox Code Playgroud)

文档:序列化集合


Jou*_*usi 11

使用内置JSON序列化器有两种常见方法:

  1. JavaScriptSerializer

    var serializer = new JavaScriptSerializer();
    return serializer.Serialize(TheList);
    
    Run Code Online (Sandbox Code Playgroud)
  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();
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,此选项需要为您的类定义数据协定:

    [DataContract]
    public class MyObjectInJson
    {
       [DataMember]
       public long ObjectID {get;set;}
       [DataMember]
       public string ObjectInJson {get;set;}
    }
    
    Run Code Online (Sandbox Code Playgroud)


Pan*_*vos 5

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

如果您已经有要将 Json 序列化为流的带注释的数据类,这会很方便,如如何:序列化和反序列化 JSON 数据中所述。有一些限制,但如果您有基本需求并且不想将 Yet Another Library 添加到您的项目中,它已经足够好且足够快。

以下代码将一个列表序列化到控制台输出流。正如你看到它是一个有点更详细的比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);
        }
Run Code Online (Sandbox Code Playgroud)

另一方面,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;
        }
Run Code Online (Sandbox Code Playgroud)