gpt4 book ai didi

.net - NewtonSoft Json 反序列化属性列表作为对象数组

转载 作者:行者123 更新时间:2023-12-04 18:56:32 24 4
gpt4 key购买 nike

我有一个奇怪的 Json 结果集,它有一个重复(但可变)的属性,我需要将其转换为对象类型的数组,例如

"result": {
"documents": {
"abcd": {
"propertyX": 0
"propertyY": "A"
},
"efgh": {
"propertyX": 5
"propertyY": "B"
},
"ijkl": {
"propertyX": 2
"propertyY": "C"
}
}
}

我想要做的是让我的 Result 对象具有文档属性,并且它有一个“项目”数组。每个项目对象将包含“propertyX”、“propertyY”等。不幸的是,“abcd”、“efgh”等是项目的随机列表,但它们被呈现为不同的属性。

有没有一种直接的方法来处理这个问题,或者我需要一个自定义转换器吗?

最佳答案

是的,处理这个问题的直接方法是使用 Dictionary<string, Item>为您 documents属性(property)。随机的文档名称将成为字典的键。您可以像这样声明类:

class RootObject
{
public Result Result { get; set; }
}

class Result
{
public Dictionary<string, Item> Documents { get; set; }
}

class Item
{
public string PropertyX { get; set; }
public string PropertyY { get; set; }
}

然后像这样反序列化 JSON:
RootObject root = JsonConvert.DeserializeObject<RootObject>(json);

fiddle : https://dotnetfiddle.net/lTDGj3

如果您不想在您的类(class)中使用字典,而是真的希望拥有一个项目数组(或列表),那么是的,您将需要一个转换器。在这种情况下,您可以像这样声明您的类:
class RootObject
{
public Result Result { get; set; }
}

class Result
{
[JsonConverter(typeof(DocumentListConverter))]
public List<Item> Documents { get; set; }
}

class Item
{
public string Name { get; set; }
public string PropertyX { get; set; }
public string PropertyY { get; set; }
}

文档列表的自定义转换器类将如下所示:
class DocumentListConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(List<Item>);
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JObject jo = JObject.Load(reader);
List<Item> items = new List<Item>();
foreach (JProperty prop in jo.Properties())
{
Item item = prop.Value.ToObject<Item>();
item.Name = prop.Name;
items.Add(item);
}
return items;
}

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

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

你会像以前一样反序列化:
RootObject root = JsonConvert.DeserializeObject<RootObject>(json);

fiddle : https://dotnetfiddle.net/xWRMGP

关于.net - NewtonSoft Json 反序列化属性列表作为对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51407040/

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