JSON 来自第 3 方的具有不同嵌套模式的响应 API
JSON response with varying nesting pattern from 3rd-party API
我收到第三方 API 响应,其中包含多个嵌套属性:
变体 1:
{
"Property1": {
"Property2A": {
"Key1": "1",
"Key2": "2",
"Key3": "3"
},
"Property2B": {
"Property3": {
"Key4": "A",
"Key5": "B",
"Key6": "C",
"Property4": {
"Property5": {
"Property6": [
{
"Key7": "1",
"Property7A": {
"X": "1"
},
"Property7B": {
"X": "2"
},
"Property7C": {
"X": "3"
}
},
{
"Property7D": {
"X": "INeedThisString"
}
}
]
}
}
}
}
}
}
我只需要值“INeedThisString”。
我能够通过合适的模型结构(通过将模型映射到 Json-File 生成)并使用以下声明来达到 属性 "X": "INeedThisString"
的值:
Rootobject obj = JsonConvert.DeserializeObject<Rootobject>(MyJsonString);
string result = obj.Property1.Property2B.Property3.Property4.Property5.Property6[1].Property7D.X;
这是我的问题:
API 有时会发布此架构的变体,唯一的区别是 Property3 声明为数组,例如:
变体 2:
{
"Property1": {
"Property2A": {
"Key1": "1",
"Key2": "2",
"Key3": "3"
},
"Property2B": {
"Property3": [ //<-----
{
"Key4": "A",
"Key5": "B",
"Key6": "C",
"Property4": {
"Property5": {
"Property6": [
{
"Key7": "1",
"Property7A": {
"X": "1"
},
"Property7B": {
"X": "2"
},
"Property7C": {
"X": "3"
}
},
{
"Property7D": {
"X": "INeedThisString"
}
}
]
}
}
}
] //<-----
}
}
}
//<-----
:为了说明目的添加了 2x。
显然,变体 1 和我当前的模型结构没有将 Property3
声明为数组。
问题:
在预处理中不触及 Json (deletions/replacements) 的情况下解决此问题的优雅方法是什么?
我是否应该实施一组替代模型并通过错误函数在这两个模型集之间切换?请注意属性 7A
-7D
中的键都是相同的:"X"
.
我当前的工作解决方案涵盖了解析所需的另一组 类,由 Json 响应的映射变体 2 产生。
所有 类 都由 Json headers [Json属性("actual-string-shown-in-Json")] 通过使用指令 using Newtonsoft.Json
.
两个备选 JsonConvert
函数放在 try-catch 语句中:
string result;
try
{
Rootobject obj = JsonConvert.DeserializeObject<Rootobject>(MyJsonString);
result = obj.Property1.Property2B.Property3.Property4.Property5.Property6[1].Property7D.X;
}
catch
{
AltRootobject obj = JsonConvert.DeserializeObject<AltRootobject>(MyJsonString);
result = obj.AltProperty1.AltProperty.AltProperty[0].AltProperty.AltProperty5.AltProperty6[1].AltProperty7D.AltX;
}
我收到第三方 API 响应,其中包含多个嵌套属性:
变体 1:
{
"Property1": {
"Property2A": {
"Key1": "1",
"Key2": "2",
"Key3": "3"
},
"Property2B": {
"Property3": {
"Key4": "A",
"Key5": "B",
"Key6": "C",
"Property4": {
"Property5": {
"Property6": [
{
"Key7": "1",
"Property7A": {
"X": "1"
},
"Property7B": {
"X": "2"
},
"Property7C": {
"X": "3"
}
},
{
"Property7D": {
"X": "INeedThisString"
}
}
]
}
}
}
}
}
}
我只需要值“INeedThisString”。
我能够通过合适的模型结构(通过将模型映射到 Json-File 生成)并使用以下声明来达到 属性 "X": "INeedThisString"
的值:
Rootobject obj = JsonConvert.DeserializeObject<Rootobject>(MyJsonString);
string result = obj.Property1.Property2B.Property3.Property4.Property5.Property6[1].Property7D.X;
这是我的问题:
API 有时会发布此架构的变体,唯一的区别是 Property3 声明为数组,例如:
变体 2:
{
"Property1": {
"Property2A": {
"Key1": "1",
"Key2": "2",
"Key3": "3"
},
"Property2B": {
"Property3": [ //<-----
{
"Key4": "A",
"Key5": "B",
"Key6": "C",
"Property4": {
"Property5": {
"Property6": [
{
"Key7": "1",
"Property7A": {
"X": "1"
},
"Property7B": {
"X": "2"
},
"Property7C": {
"X": "3"
}
},
{
"Property7D": {
"X": "INeedThisString"
}
}
]
}
}
}
] //<-----
}
}
}
//<-----
:为了说明目的添加了 2x。
显然,变体 1 和我当前的模型结构没有将 Property3
声明为数组。
问题:
在预处理中不触及 Json (deletions/replacements) 的情况下解决此问题的优雅方法是什么?
我是否应该实施一组替代模型并通过错误函数在这两个模型集之间切换?请注意属性 7A
-7D
中的键都是相同的:"X"
.
我当前的工作解决方案涵盖了解析所需的另一组 类,由 Json 响应的映射变体 2 产生。
所有 类 都由 Json headers [Json属性("actual-string-shown-in-Json")] 通过使用指令 using Newtonsoft.Json
.
两个备选 JsonConvert
函数放在 try-catch 语句中:
string result;
try
{
Rootobject obj = JsonConvert.DeserializeObject<Rootobject>(MyJsonString);
result = obj.Property1.Property2B.Property3.Property4.Property5.Property6[1].Property7D.X;
}
catch
{
AltRootobject obj = JsonConvert.DeserializeObject<AltRootobject>(MyJsonString);
result = obj.AltProperty1.AltProperty.AltProperty[0].AltProperty.AltProperty5.AltProperty6[1].AltProperty7D.AltX;
}