如何使用 Newtonsoft.Json 将包含数组数组的 json 对象解析为 C# 中的对象列表?
Posted
技术标签:
【中文标题】如何使用 Newtonsoft.Json 将包含数组数组的 json 对象解析为 C# 中的对象列表?【英文标题】:How do I parse a json object containing a array of arrays into a list of objects in C# using Newtonsoft.Json? 【发布时间】:2021-03-19 00:23:56 【问题描述】:我很少使用 json,所以如果我没有正确命名所有名称,我很抱歉。
我有一个预定义的 json 字符串,其中包含大量点(x,y;整数),这些点包含在“值”中。每个点都是 JSON 中 2 个值的列表。
剥离到主要内容的 json 字符串如下所示:
"values":[[3621,67],[445,117]],"more_key":"move_value","much_more_key":"much_move_value"
我的工作是这样的:
public class RootObject
public List<int[]> values get; set;
public string more_key get; set;
public string much_more_key get; set;
使用以下行进行反序列化(并在稍后进行序列化):
_rootObject = JsonConvert.DeserializeObject<RootObject>(jsonString);
...
JsonConvert.SerializeObject(_rootObject);
但我不想要一个 int 数组列表。我想获得(点)对象的列表。 我想要的工作是这样的:
public class RootObject
public List<MyPoint> values get; set;
public string more_key get; set;
public string much_more_key get; set;
public class MyPoint
public int x;
public int y;
// more member variables not from json
public bool notFromJSON;
到目前为止,我还没有找到实现此目的的方法。
在反序列化和序列化之间想要对这个 MyPoint 列表做一些工作,并且需要这个类中的其他成员。
任何提示如何达到此目的将不胜感激。
【问题讨论】:
如果它是一个坐标,为什么不创建一个坐标对象并将 x 和 y 设为属性呢?列表。那么你的问题就解决了。 我知道你确实想使用一个对象。我不确定 NewtonSoft.Json 已经有一段时间了,但一般来说,对于序列化包,您必须使用诸如[Serializable]
之类的属性来标记该类,否则它将被忽略。检查文档。 newtonsoft.com/json/help/html/SerializationGuide.htm#Objects
您可以为您的MyPoint
类创建一个简单的JsonConverter
,就像Serializing/deserializing arrays with mixed types using Json.NET 中显示的那样。
如果问题与未出现在 JSON 中的被忽略属性有关,那么最好使用单独的对象来表示它。否则,[JsonIgnore]
属性将是您可以使用的选项。 newtonsoft.com/json/help/html/PropertyJsonIgnore.htm
【参考方案1】:
感谢 Brian Rogers 和 Omar Abdel Bari 为我指明了正确的方向。
我需要编写一个 JsonConverter(如下所述:Serializing/deserializing arrays with mixed types using Json.NET),而不是立即工作。
public class RootObject
public List<MyPoint> values get; set;
public string more_key get; set;
public string much_more_key get; set;
[JsonConverter(typeof(MyPointConverter))]
public class MyPoint
public int X;
public int Y;
// more member variables not from json
public bool notFromJSON;
public MyPoint()
X = -1;
Y = -1;
class MyPointConverter : JsonConverter
public override bool CanConvert(Type objectType)
return (objectType == typeof(MyPoint));
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
JArray ja = JArray.Load(reader);
MyPoint myPoint = new MyPoint();
myPoint.X = (int)ja[0];
myPoint.Y = (int)ja[1];
return myPoint;
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
JArray ja = new JArray();
MyPoint myPoint = (MyPoint)value;
ja.Add(myPoint.X);
ja.Add(myPoint.Y);
ja.WriteTo(writer);
【讨论】:
以上是关于如何使用 Newtonsoft.Json 将包含数组数组的 json 对象解析为 C# 中的对象列表?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Asp.net Core Web Api 中默认使用 Newtonsoft.Json?
将 Newtonsoft.Json 代码迁移到 System.Text.Json
如何使用 C# 进行条件序列化 - NewtonSoft.Json