将列表序列化为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
replace这种危险的代码,并得到相同的结果。 我将如何做到这一点?
谢谢。
// you need to reference System.Web.Extensions using System.Web.Script.Serialization; var jsonSerialiser = new JavaScriptSerializer(); var json = jsonSerialiser.Serialize(aList);
请注意:
时代已经改变,我会默认使用JSON.Net作为我的第一selectJSONparsing器。 如果它是WebAPI的正确select,那对我来说是正确的select。
例如
using Newtonsoft.Json; var json = JsonConvert.SerializeObject(aList);
您可能需要先安装软件包。
PM> Install-Package Newtonsoft.Json
有关更多详细信息, 请参阅并提供作为此信息源的答案 。
你也可以使用Json.NET。 只需在http://james.newtonking.com/pages/json-net.aspx下载它,提取压缩文件并将其添加为参考。;
然后,只需序列化列表(或任何你想要的对象)与以下内容:
using Newtonsoft.Json; string json = JsonConvert.SerializeObject(listTop10);
更新:您也可以通过NuGet包pipe理器(工具 – > NuGet包pipe理器 – >包pipe理器控制台)将其添加到您的项目中:
PM> Install-Package Newtonsoft.Json
文档: 序列化集合
使用内置的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;} }
.NET已经通过System.Runtime.Serialization.Json命名空间和DataContractJsonSerializer类从3.5版开始支持基本的Json序列化。 顾名思义,DataContractJsonSerializer会考虑添加到对象中的任何数据注释以创build最终的Json输出。
如果您已经有了要将Json序列化为stream的带注释的数据类,那么可以很方便,如“ 如何:序列化和反序列化JSON数据”中所述 。 有一些限制,但如果您有基本的需求,并且不想将另一个库添加到您的项目,那么它就足够好,足够快。
以下代码将一个列表序列化为控制台输出stream。 正如你所看到的,它比Json.NET更冗长,而不是types安全的(即没有generics)
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类,格式化date到JSON等。
另一种select是ServiceStack.Text ,它是ServicStack … stack的一部分,它为Json,JSV和CSV提供了一组非常快速的序列化程序。
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; }
- jQuery $(文档).ready和UpdatePanels?
- 浏览器取消请求时出现ASP.NET Web API OperationCanceledException
- 如何在C#中获取用户的公共IP地址
- 什么是从数据库中填充DropDownList的正确方法?
- 在Asp.net WebApi自定义授权 – 什么混乱?
- ASP.NET身份默认密码哈希,它是如何工作的,它是安全的?
- entity framework:如何解决“FOREIGN KEY约束可能导致周期或多个级联path”?
- 在ASP.NET中传输文件的最佳方法
- .NETconfiguration(app.config / web.config / settings.settings)