繁体   English   中英

How do I parse a json object containing a array of arrays into a list of objects in C# using Newtonsoft.Json?

[英]How do I parse a json object containing a array of arrays into a list of objects in C# using Newtonsoft.Json?

我很少使用 json,所以如果我没有正确命名所有名称,我很抱歉。

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

剥离到主要内容 json 字符串如下所示:

{"values":[[3621,67],[445,117]],"more_key":"move_value","much_more_key":"much_move_value"}

我的 go 工作是这样的:

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 arrays 的列表。 我想获得(点)对象的列表。 我想要工作的是这样的:

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 列表做一些工作,并且需要这个 class 中的其他成员。

任何提示如何做到这一点将不胜感激。

感谢 Brian Rogers 和 Omar Abdel Bari 为我指明了正确的方向。

我需要编写一个 JsonConverter (如此处所述:使用 Json.NET 使用混合类型对 arrays 进行序列化/反序列化),而不是立即工作。

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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM