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

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.NET。只需在http://james.newtonking.com/pages/json-net.aspx上下载它,提取压缩文件并添加它作为参考。

然后只需序列化列表(或任何你想要的对象)如下:

using Newtonsoft.Json;

string json = JsonConvert.SerializeObject(listTop10);

更新:您也可以将它添加到您的项目通过NuGet包管理器(工具-> NuGet包管理器->包管理器控制台):

PM> Install-Package Newtonsoft.Json

文档:序列化集合

其他回答

. net已经通过System.Runtime.Serialization.Json命名空间和DataContractJsonSerializer类从3.5版开始支持基本的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。NET对如何生成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

文档:序列化集合

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序列化器有两种常见的方法:

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

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

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