【发布时间】:2017-05-24 03:55:06
【问题描述】:
我正在尝试解析一个 JSON 响应,其中包含我不太熟悉的内容,而且我在野外也没有经常看到。
在其中一个 JSON 对象中,有一个动态命名的 JSON 对象。
在此示例中,"bugs" 中有一个名为 "12345" 的 JSON 对象,它与错误编号相关。
{
"bugs" : {
"12345" : {
"comments" : [
{
"id" : 1,
"text" : "Description 1"
},
{
"id" : 2,
"text" : "Description 2"
}
]
}
}
}
我很好奇的是:解析像这样动态命名的 JSON 对象最有效的方法是什么?
鉴于一些 JSON 实用工具,例如
他们会接受一个像上面这样的 JSON 响应,并将其转换为如下所示的类:
jsonutils
public class Comment
{
public int id { get; set; }
public string text { get; set; }
}
public class 12345
{
public IList<Comment> comments { get; set; }
}
public class Bugs
{
public 12345 12345 { get; set; }
}
public class Root
{
public Bugs bugs { get; set; }
}
json2charp
public class Comment
{
public int id { get; set; }
public string text { get; set; }
}
public class __invalid_type__12345
{
public List<Comment> comments { get; set; }
}
public class Bugs
{
public __invalid_type__12345 __invalid_name__12345 { get; set; }
}
public class RootObject
{
public Bugs bugs { get; set; }
}
问题在于它会生成一个动态名称的class。因此,使用此 API 的其他标识符的后续查询将导致失败,因为名称不匹配,生成的 [JsonProperty("")] 也不匹配,因为它包含上面生成的示例中的动态类名称。
虽然 JSON 是有效的,但这似乎是这种格式的 JSON 的限制。不幸的是,我无法控制这个 JSON API,所以我很好奇解决这个问题的最佳方法是什么?
【问题讨论】:
-
12345不是一个有效的类名,如果你不能控制属性名,这可能是这个方法的一个主要问题。 -
@DanWilson 对,这就是为什么我想知道动态 json 对象可以做什么,因为我无法控制后备存储。这似乎是不良 JSON 做法的边缘案例?
-
是的,保持属性名称静态并赋予它们动态值很有帮助。 @michael-gunter 的答案可能就是这里的解决方案。
-
Firebase 以这种格式输出数组。有关故事,请参阅此Firebase blog。他们甚至说数组是邪恶的。真的。