我正在尝试为公司使用Spring与其API接口的软件创建包装。
现在,此软件的API返回一个平面JSON对象,作为GET
请求的响应。我面临的问题取决于我们要获取的字段之一中是否有数据,这将确定响应中的值是String还是JSON对象。
在Spring中创建模型时,如何处理这种动态数据类型?
仅在处理数据时,如果该特定字段的数据为空,并且在我的模型中将数据类型设置为String
,则可以将其反序列化为我的{{1} }对象。
当该特定字段有数据时,反之亦然。我创建了一个名为LinkValueObject的自定义对象,该对象仅包含2个属性result
和link
。当我有此字段的数据时发出请求时,我可以再次正确地反序列化。我只是不确定如何动态处理这两种情况。
如果我弄错了术语,我深表歉意。
在“ assigned_to”中没有数据的响应示例:
value
在“ assigned_to”中带有数据的响应示例:
{
"result": {
"name": "Bob Ross",
"assigned_to": ""
}
}
我的模型现在看起来像这样:
{
"result": {
"name": "Bob Ross",
"assigned_to": {
"link": "https://mylink.com",
"value": "qwerty123456"
}
}
}
答案 0 :(得分:0)
您可以使用Declarative Stream Mapping (DSM)流解析库轻松完成此操作。
首先,您必须以yaml或JSON格式定义JSON数据和字段之间的映射。
以下是映射定义:
private void DataGrid_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
e.Handled = true;
RaiseEvent(new KeyEventArgs(Keyboard.PrimaryDevice, PresentationSource.FromVisual(this), 0, Key.Enter)
{
RoutedEvent = Keyboard.KeyDownEvent
});
}
}
您要反序列化的Java类(与您的类相同):
result:
type: object
path: /result
fields:
name:
assignedTo:
type: object
path: assigned_to
filter: self.data.link!=null # if link value is null filter assignedTo field fields:
link:
value:
用于解析JSON的Java代码:
public class Result {
public String name;
public LinkValueObject assignedTo;
@Override
public String toString() {
return "Result [name=" + name + ", assignedTo=" + assignedTo + "]";
}
public static class LinkValueObject{
public String link;
public String value;
@Override
public String toString() {
return "LinkValueObject [link=" + link + ", value=" + value + "]";
}
}
}
System.out.println(object);
以下是输出:
第一个输入:
DSM dsm=new DSMBuilder(new File("path/to/mapping.yaml")).create(Result.class);
Result result= (Result)dsm.toObject(jsonData);
第一个输出:
{
"result": {
"name": "Bob Ross",
"assigned_to": ""
}
}
第二个输入:
Result [name=Bob Ross, assignedTo=null]
第二个输出:
{
"result": {
"name": "Bob Ross",
"assigned_to": {
"link": "https://mylink.com",
"value": "qwerty123456"
}
}
}