我有一个如下所示的对象模型:
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
替换这种危险代码并获得相同的结果。
我该怎么做?
感谢。
答案 0 :(得分:292)
// you need to reference System.Web.Extensions
using System.Web.Script.Serialization;
var jsonSerialiser = new JavaScriptSerializer();
var json = jsonSerialiser.Serialize(aList);
请注意:
时代已经改变,我默认使用JSON.Net作为我的首选JSON Parser。如果它是WebAPI的正确选择,它对我来说是正确的选择。
e.g。
using Newtonsoft.Json;
var json = JsonConvert.SerializeObject(aList);
您可能需要先安装软件包。
PM> Install-Package Newtonsoft.Json
有关详情see and upvote the answer that is the source of this information。
答案 1 :(得分:98)
您也可以使用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
答案 2 :(得分:11)
使用内置JSON序列化器有两种常见的方法:
var serializer = new JavaScriptSerializer();
return serializer.Serialize(TheList);
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;}
}
答案 3 :(得分: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 :(得分:4)
.NET已经支持从版本3.5开始通过System.Runtime.Serialization.Json namespace和DataContractJsonSerializer类的基本Json序列化。顾名思义,DataContractJsonSerializer会考虑您添加到对象中的任何数据注释,以创建最终的Json输出。
如果您已经有要将Json序列化为流的带注释数据类,那么这可能很方便,如How To: Serialize and Deserialize JSON Data中所述。有一些限制,但如果您有基本需求并且不想在您的项目中添加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.Text,它是ServicStack ...堆栈的一部分,它为Json,JSV和CSV提供了一组非常快速的序列化器。
答案 5 :(得分: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));
}
答案 6 :(得分:0)
如果您是在asp.Net Core API操作的上下文中执行此操作的,则隐式地完成了到Json的转换。
}
答案 7 :(得分:0)
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; }
}
}