具有运行时未知字段的定制Gson序列化器

时间:2019-02-20 21:50:56

标签: java json gson

我正在尝试执行自定义Gson序列化以创建一个Json对象以发送到服务,除了它们是一些在运行时未知的字段。

我想要创建的json应该看起来像这样:

{
    "type": "configuration/entityTypes/HCP",
    "attributes": {
        "FirstName": [
            {
                "type": "configuration/entityTypes/HCP/attributes/FirstName",
                "value": "Michael"
            }
        ]

    },
    "crosswalks": [
        {
            "type": "configuration/sources/AMA",
            "value": "10000012"
        }
    ]
}

我能够使用Gson成功创建此json,但是问题是我有成千上万个可能位于attribute对象下的字段,在此示例中只有FirstName,但是如果我正在创建的属性将与该人,地点或事物所关联的属性一样多。

因为当前我可以使用Gson通过创建4个不同的类来创建它:

  1. 类型
  2. 属性
  3. 名字
  4. 人行横道

但是我希望能够在属性对象下面都包含FirstName,LastName,MiddleName等,而不必为所有属性创建单独的Java类。在这种情况下,json看起来像这样:

{
    "type": "configuration/entityTypes/HCP",
    "attributes": {
        "FirstName": [
            {
                "type": "configuration/entityTypes/HCP/attributes/FirstName",
                "value": "Doe"
            }
        ],
        "LastName": [
            {
                "type": "configuration/entityTypes/HCP/attributes/LastName",
                "value": "John"
            }
        ],
        "MiddleName": [
            {
                "type": "configuration/entityTypes/HCP/attributes/MiddleName",
                "value": "Michael"
            }
        ]

    },
    "crosswalks": [
        {
            "type": "configuration/sources/AMA",
            "value": "10000012"
        }
    ]
}

有没有一种方法可以使用Gson创建属性对象而无需为我拥有的所有不同属性创建Java对象?

1 个答案:

答案 0 :(得分:1)

您可以使用Map<String, Object>,其中Object将是一个单元素数组。例如,参见下面的模型:

class Attributes {

    private Map<String, Object> attributes;

    // getters, setters
}

class Type {

    private final String type;
    private final String value;

    public Type(String type, String value) {
        this.type = type;
        this.value = value;
    }

    // getters
}

现在,让我们手动构建attributes

import com.google.gson.Gson;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public class GsonApp {

    public static void main(String[] args) {
        Map<String, Object> map = new HashMap<>();
        map.put("FirstName", Collections.singletonList(new Type("url/FirstName", "Rick")));
        map.put("LastName", Collections.singletonList(new Type("url/LastName", "Pickle")));

        Attributes attributes = new Attributes();
        attributes.setAttributes(map);

        String json = new Gson().newBuilder().setPrettyPrinting().create().toJson(attributes);
        System.out.println(json);
    }
}

上面的代码显示:

{
  "attributes": {
    "FirstName": [
      {
        "type": "url/FirstName",
        "value": "Rick"
      }
    ],
    "LastName": [
      {
        "type": "url/LastName",
        "value": "Pickle"
      }
    ]
  }
}