将列表序列化为JSON


182

我有一个看起来像这样的对象模型:

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.Serializationstackoverflow.com/a/18746092/1599699 stackoverflow.com/a/19299695/1599699
Andrew

Answers:


337

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

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

例如

using System.Text.Json;

var json = JsonSerializer.Serialize(aList);

另外,也可以使用其他一些不太主流的选项,例如Utf8Json解析器和Jil:如果确实需要,它们可能会提供更高的性能,但是,您需要安装各自的软件包。

如果使用.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);

1
嗯,还可以序列化对象列表,而不仅仅是对象本身。谢谢。
frenchie

不喜欢周期性关系,但这在这里不是问题
Jodrell'2

13
请注意,此命名空间巧妙地藏在System.Web.Extensions中。一旦将其添加为参考,该解决方案便会发挥出色的作用!
八位大师

1
我看到了您修改后的答案,非常希望我有一个更新的示例。
迪伦·布拉姆斯

1
其他答案中已经提供了@ IamNumber5。无论如何,我扩大了答案。
Jodrell 2015年

111

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

文档:序列化集合


11

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

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

4

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

如果您已经有想要将Json序列化为流的注释数据类,这将非常方便,如如何:序列化和反序列化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提供了一组非常快速的序列化程序。


0

建立在另一个帖子的答案上。.我想出了一种更通用的方法来构建列表,利用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));
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.