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

public MyObjectInJson
{
   public long ObjectID {get;set;}
   public string ObjectInJson {get;set;}
}

属性objectjson是一个包含嵌套列表的对象的已序列化版本。目前,我手动序列化myobjectjson的列表,就像这样:

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


当前回答

使用内置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(); } } Note, that this option requires definition of a data contract for your class: [DataContract] public class MyObjectInJson { [DataMember] public long ObjectID {get;set;} [DataMember] public string ObjectInJson {get;set;} }

其他回答

使用内置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(); } } Note, that this option requires definition of a data contract for your class: [DataContract] public class MyObjectInJson { [DataMember] public long ObjectID {get;set;} [DataMember] public string ObjectInJson {get;set;} }

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

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

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

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

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

e.g.

using System.Text.Json;

var json = JsonSerializer.Serialize(aList);

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

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

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

e.g.

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