C# 将列表序列化为JSON
我有一个如下所示的对象模型:C# 将列表序列化为JSON,c#,asp.net,json,C#,Asp.net,Json,我有一个如下所示的对象模型: public MyObjectInJson { public long ObjectID {get;set;} public string ObjectInJson {get;set;} } StringBuilder TheListBuilder = new StringBuilder(); TheListBuilder.Append("["); int TheCounter = 0; foreach (MyObjectInJ
public MyObjectInJson
{
public long ObjectID {get;set;}
public string ObjectInJson {get;set;}
}
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();
属性ObjectInJson
是包含嵌套列表的对象的已序列化版本。目前,我正在手动序列化MyObjectInJson
的列表,如下所示:
public MyObjectInJson
{
public long ObjectID {get;set;}
public string ObjectInJson {get;set;}
}
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
替换这种危险的代码,并得到同样的结果。
如果使用.Net Core 3.0或更高版本,我将如何执行此操作?;
默认使用内置的System.Text.Json
解析器实现
e、 g
或者,也可以使用其他不太主流的选项,比如parser和:如果您确实需要,这些选项可能会提供,但是您需要安装它们各自的软件包
如果使用.Net Core 2.2或更早版本卡住;
默认使用Newtonsoft JSON.Net作为首选JSON解析器
e、 g
您可能需要先安装软件包
PM> Install-Package Newtonsoft.Json
更多细节
仅供参考,这是多年前的原始答案;
使用内置JSON序列化程序有两种常见的方法:
[DataContract]
public class MyObjectInJson
{
[DataMember]
public long ObjectID {get;set;}
[DataMember]
public string ObjectInJson {get;set;}
}
自3.5版以来,.NET已经通过和类支持基本Json序列化。顾名思义,DataContractJsonSerializer会考虑添加到对象中的任何数据注释,以创建最终的Json输出 如果您已经有了要将Json序列化为流的带注释的数据类,那么这将非常方便,如中所述。虽然有一些限制,但如果您有基本的需求,并且不想再向项目中添加另一个库,那么它就足够好、足够快了 以下代码将列表序列化到控制台输出流。正如您所看到的,它比Json.NET要详细一点,并且不是类型安全的(即没有泛型)
var list=新列表{“a”、“b”、“c”、“d”};
使用(var output=Console.OpenStandardOutput())
{
var writer=newdatacontractjsonserializer(typeof(List));
WriteObject(输出,列表);
}
另一方面,它可以更好地控制如何生成Json。当您必须将javascript友好名称映射到.NET类、将日期格式化为json等时,这将非常方便
另一个选择是,部分。。。堆栈,它为Json、JSV和CSV提供了一组非常快速的序列化程序。您也可以使用Json.NET。只需在下载它,提取压缩文件并添加它作为参考 然后用以下命令序列化列表(或任何您想要的对象):
using Newtonsoft.Json;
string json = JsonConvert.SerializeObject(listTop10);
更新:您还可以通过NuGet软件包管理器(工具-->NuGet软件包管理器-->软件包管理器控制台)将其添加到项目中:
文档:公共静态字符串JSONSerialize(T obj)
{
string retVal=string.Empty;
使用(MemoryStream ms=new MemoryStream())
{
DataContractJsonSerializer=新的DataContractJsonSerializer(obj.GetType());
serializer.WriteObject(ms,obj);
var byteArray=ms.ToArray();
retVal=Encoding.UTF8.GetString(byteArray,0,byteArray.Length);
}
返回返回;
}
以另一篇帖子的答案为基础。。我提出了一种更通用的方法来构建列表,利用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;
}
}
使用Newtonsoft.Json;
静态类JsonObj
{
///
///将json文件反序列化为对象列表
///作者:Joseph Poirier 2019年2月26日
///
///
///
///
公共静态列表反序列化对象(字符串文件名)
{
List objectOut=new List();
if(string.IsNullOrEmpty(fileName)){return objectOut;}
尝试
{
//以全文形式阅读
字符串ss=File.ReadAllText(文件名);
//为避免错误而进行的。。
//第1行第2列出现意外字符
var output=JsonConvert.DeserializeObject(ss);
foreach(输出中的var记录)
{
foreach(记录中的T数据)
{
objectOut.Add(数据);
}
}
}
捕获(例外情况除外)
{
//此处记录异常
控制台。写入(例如消息);
}
退出;
}
}
呼叫处理
{
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));
}
{
string fname=“../../Names.json”;//如果您在asp.Net核心API操作的上下文中执行此操作,则会隐式地转换为json
[HttpGet]
public ActionResult Get()
{
return Ok(TheList);
}
啊,好的,它还序列化对象列表,而不仅仅是对象本身。谢谢。我不喜欢循环关系,但这不是一个问题。请注意,这个名称空间巧妙地隐藏在System.Web.Extensions中。一旦您添加它作为参考,该解决方案将非常有效!我看到了您编辑过的答案,真希望我有一个更新的名称空间示例。@IamNumber5已在另一个答案中提供。我还是扩展了我的答案。请注意,在WPF项目中,您需要添加对System.Web.Extensions
的引用才能使用System.Web.Script.Serialization
:
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;
}
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));
}
[HttpGet]
public ActionResult Get()
{
return Ok(TheList);
}