繁体   English   中英

在JSON.NET中反序列化此对象

[英]Deserializing this object in JSON.NET

我有以下对象:

{
    "pickups": {
        "7": [
            5,
            8
        ],
        "10": [
            6,
            7,
            9
        ],
        "15": [
            1
        ],
        "20": [
            0,
            2
        ],
        "25": [
            3,
            4
        ]
    }
}

我想将每个皮卡元素反序列化为以下对象:

public class Pickups {
    public Pickup[] pickups;
}

public class Pickup {
    public int Group; // This could be the 7, 10, 15, 20, 25, etc.
    public int[] Values; // If this was the "7" grouping, it would contain 5, 8.
}

正如您从数据中看到的那样,这样做有些棘手。 我一直在尝试使用JsonConverter通过一些自定义代码来转换对象,但这是一场噩梦,而我一直无法正确地做到这一点。 我想知道是否有人会知道将这种类型的对象转换成我需要的正确格式的最佳方法?

虽然转换器是一个不错的选择,但是您仍然可以反序列化Json并构造所需的对象图

var root = JsonConvert.DeserializeObject<RootObject>(json);
var pickups = new Pickups {
    pickups = root.pickups.Select(kvp =>
        new Pickup {
            Group = int.Parse(kvp.Key),
            Values = kvp.Value
        }
    ).ToArray()
};

哪里

public class RootObject {
    public IDictionary<string, int[]> pickups { get; set; }
}

这就是son2csharp.com所说的,它出错,因为您无法用开始编号定义名称。

public class Pickups
{
    public List<int> __invalid_name__7 { get; set; }
    public List<int> __invalid_name__10 { get; set; }
    public List<int> __invalid_name__15 { get; set; }
    public List<int> __invalid_name__20 { get; set; }
    public List<int> __invalid_name__25 { get; set; }
}

public class RootObject
{
    public Pickups pickups { get; set; }
}

但我觉得

[DataMember(Name = "Name")]

应该工作,因为它不是JSON格式的错误。

如果对您来说,使用JObject.Parse(...)是一个可行的选择,则可以使用以下代码(并使用异常处理和安全强制转换等将其编写得更干净):

var jsonPickups = JObject.Parse(json);
var myPickups = new Pickups
{
    pickups = jsonPickups.First.First.Select(x =>
    {
        JProperty xProp = x as JProperty;
        return new Pickup
        {
            Group = int.Parse(xProp.Name),
            Values = (xProp.Value as JArray).Select(y => int.Parse(y.ToString())).ToArray()
        };
    }).ToArray()
};

暂无
暂无

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

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