如何使用Newtonsoft.json将包含数组数组的json对象解析为C#中的对象列表?

如何使用Newtonsoft.json将包含数组数组的json对象解析为C#中的对象列表?,c#,arrays,json,object,json.net,C#,Arrays,Json,Object,Json.net,我很少使用json,因此如果我没有正确使用所有名称,我很抱歉 我有一个预定义的json字符串,其中包含大量的点(x,y;integer),这些点包含在“value”中。每个点都是JSON中2个值的列表 简而言之,json字符串的主要内容如下所示: {"values":[[3621,67],[445,117]],"more_key":"move_value","much_more_key":"much_mov

我很少使用json,因此如果我没有正确使用所有名称,我很抱歉

我有一个预定义的json字符串,其中包含大量的点(x,y;integer),这些点包含在“value”中。每个点都是JSON中2个值的列表

简而言之,json字符串的主要内容如下所示:

{"values":[[3621,67],[445,117]],"more_key":"move_value","much_more_key":"much_move_value"}
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;
}
我的工作是:

public class RootObject
{
    public List<int[]> values { get; set; }
    public string more_key { get; set; }
    public string much_more_key { get; set; }
}
公共类根对象
{
公共列表值{get;set;}
公共字符串more_key{get;set;}
公共字符串更多密钥{get;set;}
}
使用以下行进行反序列化(并在稍后进行序列化):

\u rootObject=JsonConvert.DeserializeObject(jsonString);
...
JsonConvert.SerializeObject(_rootObject);
但是我不想要int数组的列表。我想得到(点)对象的列表。 我想做的是这样的工作:

{"values":[[3621,67],[445,117]],"more_key":"move_value","much_more_key":"much_move_value"}
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;
}
公共类根对象
{
公共列表值{get;set;}
公共字符串more_key{get;set;}
公共字符串更多密钥{get;set;}
}
公共类MyPoint
{
公共int x;
公共智力;
//更多不是来自json的成员变量
公共图书馆;
}
到目前为止,我还没有找到实现这一目标的方法

在反序列化和序列化之间,我想使用MyPoint的列表做一些工作,并且需要此类中的其他成员


如果有任何提示,我们将不胜感激。

感谢布赖恩·罗杰斯和奥马尔·阿卜杜勒·巴里为我指明了正确的方向

我需要编写一个JsonConverter(如这里所描述的:),而不是立即工作

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);
    }
}
公共类根对象
{
公共列表值{get;set;}
公共字符串more_key{get;set;}
公共字符串更多密钥{get;set;}
}
[JsonConverter(类型(MyPointConverter))]
公共类MyPoint
{
公共int X;
公共智力;
//更多不是来自json的成员变量
公共图书馆;
公共MyPoint()
{
X=-1;
Y=-1;
}
}
类MyPointConverter:JsonConverter
{
公共覆盖布尔CanConvert(类型objectType)
{
返回(objectType==typeof(MyPoint));
}
公共重写对象ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序)
{
JArray ja=JArray.Load(读卡器);
MyPoint MyPoint=新的MyPoint();
myPoint.X=(int)ja[0];
myPoint.Y=(int)ja[1];
返回myPoint;
}
公共重写void WriteJson(JsonWriter编写器、对象值、JsonSerializer序列化器)
{
JArray ja=新的JArray();
MyPoint MyPoint=(MyPoint)值;
ja.Add(myPoint.X);
ja.Add(myPoint.Y);
ja.WriteTo(作家);
}
}

如果它是一个坐标,为什么不创建一个坐标对象并创建x和y属性?列表那么你的问题就解决了。我明白了,你确实想用一个对象。我对NewtonSoft.Json不太清楚。这已经有一段时间了,但一般来说,对于序列化包,您必须使用
[Serializable]
等属性标记该类,否则它将被忽略。检查文档。您可以为您的
MyPoint
类创建一个简单的
JsonConverter
,如中所示。如果问题与JSON中未出现的被忽略属性有关,则最好使用单独的对象来表示它。否则,
[JsonIgnore]
属性将是您可以使用的选项。