如何使用 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 空值

将 Newtonsoft.Json 代码迁移到 System.Text.Json

如何使用 C# 进行条件序列化 - NewtonSoft.Json

unity 中引用 Newtonsoft.Json的 DLL

如何使用 Newtonsoft.JSON 解析 JSON 响应? [复制]