【发布时间】:2017-05-09 18:45:55
【问题描述】:
我在尝试从我正在使用的 API 中反序列化一些 JSON 时遇到了一些问题。出于某种原因,API 喜欢在不需要时将数据包装在额外的层和数组中。
{
"CustomData": [
{
"Wrapper": [
{
"OptionalDataSet1": [
{
"ItemA": "Basic string"
},
{
"ItemB": "Another basic string"
}
]
}
]
}
]
}
使用 json2csharp,我得到了适用于上述示例的类。
public class OptionalDataSet1
{
public string ItemA { get; set; }
public string ItemB { get; set; }
}
public class Wrapper
{
public List<OptionalDataSet1> OptionalDataSet1 { get; set; }
}
public class CustomData
{
public List<Wrapper> Wrapper { get; set; }
}
public class RootObject
{
public List<CustomData> CustomData { get; set; }
}
我遇到的问题是根据 API 不需要“Wrapper”类。它始终存在,但将是自定义数据中的唯一项目。此外,Wrapper 内只会有一个“OptionalDataSet1”实例。还有其他“可选数据集”,但同样,它们在每个请求中都是唯一的。
最后,Wrapper 为“OptionalDataSet1”反序列化两个对象,第一个带有 ItemA 的值,第二个带有 ItemBs。还有其他数据集可以有超过 40 个可用的项目,我不想扫描一个对象的 40 个实例来查找哪个具有我要查找的单个数据属性。
我是否应该在通过删除“包装器”并将 List 属性转换为单个实例来发送它以反序列化之前从 API 接收到的 JSON 字符串,或者我是否缺少另一种方法JSON.Net 产生类似的东西
RootObject.CustomData.OptionalDataSet1.ItemB
代替
RootObject.CustomData[0].Wrapper[0].OptionalDataSet[1].ItemB
【问题讨论】:
-
试试这个解决方案,但我不知道我是否理解你的问题:stackoverflow.com/questions/30984416/…
-
你能发布一个你的外部 API json 的样例吗?我认为你发布的 json 是你正在生成的
-
您有两个不同的问题:1) 如何将嵌套的 JSON 反序列化为平面类。 2)如何根据一些过滤器有选择地反序列化数组项。对于 1) 您可以查看 Can I serialize nested properties to my class in one operation with Json.net? 或 Can I specify a path in an attribute to map a property in my class to a child property in my JSON?。 2) 对于
"OptionalDataSet1",考虑使用List<Dictionary<string, string>>。 -
JSON 示例正是外部 API 返回的内容,只是对敏感数据进行了清理。不过,我会查看其他答案,并希望自定义转换器将成为我需要的解决方案。
-
@dbc 您包含的链接之一最终将成为我所追求的解决方案。我只是在编写一个自定义的 JsonConverter,它在创建 JToken 后采用 .First 元素。粗鲁,但它有效,我不必弄乱 API 返回的 Json。