如何将固定数组解码为对象?

时间:2017-07-03 13:58:09

标签: c# json.net .net-core

我正在使用.NET Core和Json.net将rest apis调用到服务器,服务器提供的api之一有一个struct数组,但结构由两个元素数组表示,而不是一个对象当我试图将它反序列化为一个对象时,它没有这样做,并且Newtonsoft.Json.JsonSerializationException被抛出。

数据如下:

"entries":[[0,0.26],[50000,0.24],[100000,0.22],[250000,0.2]]

我的根结构和内部结构是:

public class Entry
{
    public int value { get; set; }
    public double percent { get; set; }
}
public class Item
{
    ...
    public Entry[] entries { get; set; }
}

那么有更好的方法将这个json字符串解码为struct吗?

3 个答案:

答案 0 :(得分:1)

  

{“条目”:[[0,0.26],[50000,0.24],[100000,0.22],[250000,0.2]]}

您可以使用以下模型对上面的json进行反序列化。请注意,您需要使用嵌套的List

public class JsonItem
{
    [JsonProperty("entries")]
    public List<List<double>> Entries { get; set; }
}

var json = "{ 'entries':[[0,0.26],[50000,0.24],[100000,0.22],[250000,0.2]] }";
var jsonItem = JsonConvert.DeserializeObject<JsonItem>(json);

如果您总是在列表中有两个条目,第一个是值,第二个是您可以更改模型的百分比,如下所示。

public class Entry
{
    public int Value { get; set; }
    public double Percent { get; set; }
}

public class Item
{
   public Entry[] Entries { get; set; }
}


var item = new Item
{
    Entries = jsonItem.Entries.Select(x => new Entry { Value = (int) x[0], Percent = x[1]}).ToArray()
};

答案 1 :(得分:1)

entries使用jagged浮点数组:

public class Item
{
    public float[][] entries { get; set; }
}


var serialized = "{\"entries\":[[0,0.26],[50000,0.24],[100000,0.22],[250000,0.2]]}";

var deserialized = Newtonsoft.Json.JsonConvert.DeserializeObject<Item>(serialized);

答案 2 :(得分:1)

这个怎么样:

public class Entry
{
    public Entry(double[] vals)
    {
        if (vals.Length == 2)
        {
            value = (int)vals[0];
            percent = vals[1];
        }
        else
            throw new Exception("invalid entry");
    }
    public int value { get; set; }
    public double percent { get; set; }
}

[JsonObject(MemberSerialization.OptIn)]
public class Item
{        
    [JsonProperty(propertyName: "entries")]
    public List<double[]> rawEntries { get; set; }

    public Entry[] entries
    {
        get
        {
            return rawEntries.Select(arr => new Entry(arr)).ToArray();
        }
    }
}