将列表序列化为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替换这种危险的代码并得到相同的结果。 我该怎么做呢?< / p >
630826 次浏览

如果使用。net Core 3.0或更高版本;

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

如。

using System.Text.Json;


var json = JsonSerializer.Serialize(aList);

或者,其他不太主流的选项可用,如Utf8Json解析器和吉尔:如果你真的需要,它们可能提供性能优越,但你需要安装它们各自的包。

如果使用。net Core 2.2或更早版本;

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

如。

using Newtonsoft.Json;


var json = JsonConvert.SerializeObject(aList);

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

PM> Install-Package Newtonsoft.Json

更多详细信息请看并为这条信息来源的答案投票

仅供参考,这是许多年前最初的答案;

// you need to reference System.Web.Extensions


using System.Web.Script.Serialization;


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

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

  1. < p > 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自3.5版起已经通过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);
}

另一方面,Json。网对如何生成Json提供了更好的控制。当你需要将javascript友好的名称映射到。net类,格式化日期到json等时,这将非常方便。

另一个选项是ServiceStack。文本,它是ServicStack…stack,它为Json, JSV和CSV提供了一组非常快速的序列化器。

您也可以使用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

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

建立在另一个帖子的答案上。我提出了一个更通用的方法来构建一个列表,利用动态检索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);
}

或者这个process调用

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

如果你在asp的上下文中做这个。Net Core API动作,到Json的转换是隐式完成的。

[HttpGet]
public ActionResult Get()
{
return Ok(TheList);
}
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; }
    

    

    

    

}
}

我尝试了这里的其他答案来序列化POST请求的参数,但我的后端不喜欢这样一个事实,即我正在发送数组的字符串版本。我不想总是检查参数的类型是否为字符串并将其转换为数组。

我使用的是Json。NET(现在已内置到c#中),我将List转换为一个数组,并让转换器处理其余的工作。

public class MyObjectInJson
{
public long ID;
public OtherObject[] array;
}

可以使用list.ToArray();将List转换为数组

最后使用JsonConvert,可以将整个对象转换为字符串:

string jsonString = JsonConvert.SerializeObject(objectInJson);

希望这能帮助到其他人。