我正在使用.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吗?
答案 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();
}
}
}