gpt4 book ai didi

c# - 反序列化异构 json 数据失败

转载 作者:行者123 更新时间:2023-11-30 23:10:18 24 4
gpt4 key购买 nike

所以我使用Json.net反序列化REST API返回给服务器的json数据,它返回的数据结构是:

{ "keyXXX" : [[1,2,3,...]...], "last": 12345 }

问题是“键”也是数据的一部分,它不是一个名为“键”的字段,所以我不能使用类/结构,我不得不使用 IDictionary<string, int[][]>对于第一部分,但是“最后”部分将抛出异常,因为它是单个整数而不是数组的数组。这是我试过的:

var dec = JsonConvert.DeserializeObject<IDictionary<string, int[][]>>(data);

这会抛出 json 异常:

Newtonsoft.Json.JsonSerializationException: Error converting value 1501555920 to type 'System.Decimal[][]'. Path 'last'.

//define a class
public class DPInfo
{
public decimal[][] points { get; set; }
public long last { get; set; }
}
var dec = JsonConvert.DeserializeObject<DPInfo>(data);

这行不通,因为数组的字段名是动态的,所以points在此之后将不包含任何内容。

有什么办法可以解决这个问题吗?

最佳答案

你需要一个自定义的 JsonConverter 来解决这个问题。这是一个应该有效的方法:

public class DPInfoConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(DPInfo);
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JObject obj = JObject.Load(reader);
JProperty points = obj.Properties().FirstOrDefault(p => p.Name != "last");

DPInfo info = new DPInfo
{
key = points.Name, // remove this line if you don't need the key
points = points.Value.ToObject<decimal[][]>(),
last = (long)obj["last"]
};

return info;
}

public override bool CanWrite
{
get { return false; }
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}

要使用它,只需将 [JsonConverter] 属性添加到您的类中:

[JsonConverter(typeof(DPInfoConverter))]
public class DPInfo
{
public string key { get; set; } // remove this line if you don't need the key
public decimal[][] points { get; set; }
public long last { get; set; }
}

然后,像往常一样反序列化,它应该可以工作:

string json = @"
{
""keyXXX"": [[1, 2, 3]],
""last"": 12345
}";

DPInfo info = JsonConvert.DeserializeObject<DPInfo>(json);

fiddle :https://dotnetfiddle.net/7S6STp

关于c# - 反序列化异构 json 数据失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45428353/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com