【问题标题】:Serializing a list to JSON将列表序列化为 JSON
【发布时间】:2012-02-25 00:18:20
【问题描述】:

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

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 替换这种危险代码并获得相同的结果。 我该怎么做?

【问题讨论】:

标签: c# asp.net json


【解决方案1】:

如果使用 .Net Core 3.0 或更高版本;

默认使用内置的System.Text.Json 解析器实现。

例如

using System.Text.Json;

var json = JsonSerializer.Serialize(aList);

另外,还可以使用其他不太主流的选项,例如 Utf8Json parser 和 Jil:它们可能会提供 superior performance,如果您确实需要它,但您需要安装它们各自的包。

如果使用 .Net Core 2.2 或更早版本卡住;

默认使用 Newtonsoft JSON.Net 作为您的首选 JSON 解析器。

例如

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

仅供参考,这是多年前的原始答案;

// you need to reference System.Web.Extensions

using System.Web.Script.Serialization;

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

【讨论】:

  • 啊,好吧,它还序列化对象列表,而不仅仅是对象本身。谢谢。
  • 不喜欢周期性关系,但这不是问题
  • 请注意,这个命名空间巧妙地隐藏在 System.Web.Extensions 中。将其添加为参考后,该解决方案将非常有效!
  • 我看到你编辑的答案,真希望我有一个更新的例子。
  • @IamNumber5 已在其他答案中提供。无论如何,我扩展了我的答案。
【解决方案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

文档:Serializing Collections

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:
      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;
              }
      

      【讨论】:

        【解决方案5】:

        .NET 从 3.5 版开始已经通过 System.Runtime.Serialization.Json namespaceDataContractJsonSerializer 类支持基本的 Json 序列化。顾名思义,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 提供了一组非常快速的序列化程序。

        【讨论】:

          【解决方案6】:

          如果您在 asp.Net Core API 操作的上下文中执行此操作,则会隐式完成到 Json 的转换。

          [HttpGet]
          public ActionResult Get()
          {
              return Ok(TheList);
          }
          

          【讨论】:

          • 在我的情况下它没有序列化
          • @Gilboot 它在做什么?
          • 没关系,我漏掉了 { get;放; } 关于财产。我是一名初学者 C# 程序员。还是谢谢
          【解决方案7】:

          基于另一个帖子的答案。我想出了一个更通用的方法来构建一个列表,利用 Json.NET 版本 12.x 的动态检索

          using Newtonsoft.Json;
          
          static class JsonObj
          {
              /// <summary>
              /// Deserializes a json file into an object list
              /// Author: Joseph Poirier 2/26/2019
              /// </summary>
              /// <typeparam name="T"></typeparam>
              /// <param name="fileName"></param>
              /// <returns></returns>
              public static List<T> DeSerializeObject<T>(string fileName)
              {
                  List<T> objectOut = new List<T>();
          
                  if (string.IsNullOrEmpty(fileName)) { return objectOut; }
          
                  try
                  {
                      // reading in full file as text
                      string ss = File.ReadAllText(fileName);
          
                      // went with <dynamic> over <T> or <List<T>> to avoid error..
                      //  unexpected character at line 1 column 2
                      var output = JsonConvert.DeserializeObject<dynamic>(ss);
          
                      foreach (var Record in output)
                      {
                          foreach (T data in Record)
                          {
                              objectOut.Add(data);
                          }
                      }
                  }
                  catch (Exception ex)
                  {
                      //Log exception here
                      Console.Write(ex.Message);
                  }
          
                  return objectOut;
              }
          }
          

          调用进程

          {
                  string fname = "../../Names.json"; // <- your json file path
          
                  // for alternate types replace string with custom class below
                  List<string> jsonFile = JsonObj.DeSerializeObject<string>(fname);
          }
          

          或者这个调用来处理

          {
                  string fname = "../../Names.json"; // <- your json file path
          
                  // for alternate types replace string with custom class below
                  List<string> jsonFile = new List<string>();
                  jsonFile.AddRange(JsonObj.DeSerializeObject<string>(fname));
          }
          

          【讨论】:

            【解决方案8】:
            using System;
              using System.Text.Json;   
              using System.Collections.Generic;
            
                public class Program
                {
                    public static void Main()
                    {
                        
                        List<ErrorDetail>  aList = new List<ErrorDetail>();
                        ErrorDetail a = new  ErrorDetail{ ColumnName="aaa", ErrorText="abbbb"};
                        ErrorDetail c = new  ErrorDetail{ ColumnName="ccc", ErrorText="cccc"};
                        ErrorDetail b = new  ErrorDetail{ ColumnName="ccc", ErrorText="cccc"};
                        aList.Add(a);
                        aList.Add(b);
                        aList.Add(c);
                        
                        var json = JsonSerializer.Serialize(aList);
                        
                        Console.WriteLine(json);
                    }
                    
                    public class ErrorDetail
                    {
                       
                        public string ColumnName { get; set; }
                
                       
                        public string ErrorText { get; set; }
                
                
                
                
                    }
                }
            

            【讨论】:

            • [{"ColumnName":"aaa","ErrorText":"abbbb"},{"ColumnName":"ccc","ErrorText":"cccc"},{"ColumnName": "ccc","ErrorText":"cccc"}]
            猜你喜欢
            • 1970-01-01
            • 2016-12-22
            • 1970-01-01
            • 2016-12-29
            • 1970-01-01
            • 2020-03-15
            • 2021-12-10
            • 1970-01-01
            相关资源
            最近更新 更多