将列表序列化为 JSON

     2023-04-12     212

关键词:

【中文标题】将列表序列化为 JSON【英文标题】:Serializing a list to 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 替换这种危险代码并获得相同的结果。 我该怎么做?

【问题讨论】:

注意,在WPF项目中,需要添加对System.Web.Extensions的引用才能使用System.Web.Script.Serialization:***.com/a/18746092/1599699***.com/a/19299695/1599699 【参考方案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 序列化程序有两种常用方法:

    JavaScriptSerializer

    var serializer = new JavaScriptSerializer();
    return serializer.Serialize(TheList);
    

    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 namespace 和 DataContractJsonSerializer 类支持基本的 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"]

Jackson 将列表序列化为 xml 和 json

】Jackson将列表序列化为xml和json【英文标题】:Jacksonserializelisttoxml&json【发布时间】:2021-12-1001:28:02【问题描述】:我有一个要序列化为json和XML的类:@JacksonXmlRootElement(localName="devices")classDeviceWrapper//<--thisclassisintendedtoprovider... 查看详情

无法将 python 列表序列化为 json

】无法将python列表序列化为json【英文标题】:Unabletoserialisepythonlisttojson【发布时间】:2020-03-1522:45:15【问题描述】:[\'topleft\':\'x\':34,\'y\':13,\'confidence\':0.17681329,\'bottomright\':\'x\':398,\'y\':347,\'label\':\'person\',\'topleft\':\' 查看详情

将 json 反序列化为匿名类型列表

】将json反序列化为匿名类型列表【英文标题】:deserializejsonintolistofanonymoustype【发布时间】:2012-08-0522:33:48【问题描述】:我有一个json如下:"["a":"b","c":"d","a":"e","c":"f","a":"g","c":"h"]"现在我想将其反序列化为匿名类型“foo”的对... 查看详情

将特定 JSON 字段反序列化为 Unity 中的对象列表

】将特定JSON字段反序列化为Unity中的对象列表【英文标题】:DeserializingspecificJSONfieldsintoalistofobjectsinUnity【发布时间】:2021-09-0907:03:07【问题描述】:对于个人项目,我正在尝试将大型Json数组反序列化为对象列表,但是在遵循其... 查看详情

将json反序列化为键值对列表[重复]

】将json反序列化为键值对列表[重复]【英文标题】:DeserializejsontolistofKeyValuepairs[duplicate]【发布时间】:2018-10-2102:44:48【问题描述】:我有以下json:["key":"key1","value":"val1","key":"key2","value":"val2"]如何将其反序列化为NameValuePair&lt;... 查看详情

使用 datagridview 将列表序列化为现有的 .Json 文件

】使用datagridview将列表序列化为现有的.Json文件【英文标题】:Serializelisttoanexisting.Jsonfile,usingadatagridview【发布时间】:2021-12-2912:25:03【问题描述】:我有一个反序列化的json文件直接输出到DGV,并且在DGV中对最终用户可见。当他... 查看详情

将对象列表序列化为没有父对象名称的 JSON

】将对象列表序列化为没有父对象名称的JSON【英文标题】:SerializeobjectslisttoJSonwithoutParentobjectname【发布时间】:2019-03-0106:52:19【问题描述】:我有对象列表并在我的MVC应用程序中使用下面的代码输出它们。publicJsonResultConversionIn... 查看详情

将 JSON 对象反序列化为 .NET HashSet 和列表失败

】将JSON对象反序列化为.NETHashSet和列表失败【英文标题】:DeserializeJSONobjectas.NETHashSetandListsFailed【发布时间】:2021-07-1422:56:14【问题描述】:我有这种想要保存的Json:"data":"importMannerTypeList":"importMannerTypeID":5,"importMannerTypeDesc":"a",... 查看详情

Newtonsoft Json 将字典反序列化为来自 DataContractJsonSerializer 的键/值列表

...nsoftJson将字典反序列化为来自DataContractJsonSerializer的键/值列表【英文标题】:NewtonsoftJsonDeserializeDictionaryasKey/ValuelistfromDataContractJsonSerializer【发布时间】:2015-04-1116:25:57【问题描述】:我有一个使用DataContractJsonSerializer序列化到... 查看详情

如何将 django/python 中的模型对象列表序列化为 JSON

】如何将django/python中的模型对象列表序列化为JSON【英文标题】:HowtoserializetoJSONalistofmodelobjectsindjango/python【发布时间】:2012-10-1310:06:44【问题描述】:我正在尝试序列化定义为的模型对象列表:classAnalysisInput(models.Model):input_user... 查看详情

我正在尝试使用 .NET 3.1 将 JSON 反序列化为对象列表

】我正在尝试使用.NET3.1将JSON反序列化为对象列表【英文标题】:IamtryingtodeserializeaJSONintoalistofobjectsusing.NET3.1【发布时间】:2021-12-1020:03:34【问题描述】:我有以下Json:"Id":"2727","Region":"US","Data":["Title":"Director","JobDescription":"Coordin... 查看详情

将复杂的 json 文件反序列化为 POJO - 作为一个列表元素工作,或者不作为

】将复杂的json文件反序列化为POJO-作为一个列表元素工作,或者不作为【英文标题】:DeserializingcomplexjsonfileintoaPOJO-workseitherasonelistelement,ordoesn\'t【发布时间】:2019-08-2111:17:03【问题描述】:我正在尝试将此json反序列化为POJO类,... 查看详情

C# JSON 将文件反序列化为对象列表失败,并将字符串转换为集合错误

】C#JSON将文件反序列化为对象列表失败,并将字符串转换为集合错误【英文标题】:C#JSONdeserializeafileintoobjectlistfailswithconvertStringtoCollectionerror【发布时间】:2021-11-0821:21:14【问题描述】:我有一个学校的小项目,我们在这里处理... 查看详情

将 JSON 命名属性反序列化为 .Net 对象

...对象数组的属性。我想我想将这部分反序列化为一个.Net列表,问题是数组中的每个对象都带有一个名称,所以我无法将它作为一个列表。这是有效载荷:"ShipAction":"GetQuo 查看详情

Symfony - 将 json 反序列化为实体数组

...通过getAPI调用收到的json对象。我进行此调用以接收对象列表。这是一个帖子列表......所以我有一个帖子对象数组。这里是输出:"total":2,"data":["id":2,"user":"id":1,"usern 查看详情

使用 .NET 4.0 任务模式使用 HTTPClient .ReadAsAsync 将 JSON 反序列化为数组或列表

...T4.0任务模式使用HTTPClient.ReadAsAsync将JSON反序列化为数组或列表【英文标题】:DeserializeJSONtoArrayorListwithHTTPClient.ReadAsAsyncusing.NET4.0Taskpattern【发布时间】:2014-06-1000:27:49【问题描述】:我正在尝试使用.NET4.0任务模式反序列化从http:/... 查看详情

如何将json序列化为sql?

...发布时间】:2022-01-1805:54:41【问题描述】:我有一个单词列表,我应该向API发送请求并获取有关单词的信息。我想在Django中将JSON格式的API数据转换为SQL(我的数据库是PostgreSQL)格式。我怎样才能做到这一点?你知道任何学习将j... 查看详情

使用springboot将json反序列化为带有通用对象列表的pojo

...数据,然后列出搜索到的对象。我正在尝试使用通用对象列表来实现这一点我没有测试过这些类,所有内容都完全符合我的要求。testsearch.JavapublicclassTestSearch<T>{privateStringcount;privateList<T>resul 查看详情