使用Spring反序列化请求时如何处理动态JSON值类型?

时间:2019-05-23 21:37:44

标签: java json spring jackson

我正在尝试为公司使用Spring与其API接口的软件创建包装。

现在,此软件的API返回一个平面JSON对象,作为GET请求的响应。我面临的问题取决于我们要获取的字段之一中是否有数据,这将确定响应中的值是String还是JSON对象。

在Spring中创建模型时,如何处理这种动态数据类型?

仅在处理数据时,如果该特定字段的数据为空,并且在我的模型中将数据类型设置为String,则可以将其反序列化为我的{{1} }对象。

当该特定字段有数据时,反之亦然。我创建了一个名为LinkValueObject的自定义对象,该对象仅包含2个属性resultlink。当我有此字段的数据时发出请求时,我可以再次正确地反序列化。我只是不确定如何动态处理这两种情况。

如果我弄错了术语,我深表歉意。

在“ assigned_to”中没有数据的响应示例:

value

在“ assigned_to”中带有数据的响应示例:

{
    "result": {
        "name": "Bob Ross",
        "assigned_to": ""
    }
}

我的模型现在看起来像这样:

{
    "result": {
        "name": "Bob Ross",
        "assigned_to": {
            "link": "https://mylink.com",
            "value": "qwerty123456"
        }
    }
}

1 个答案:

答案 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"
        }
    }
}