我正在尝试执行自定义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个不同的类来创建它:
但是我希望能够在属性对象下面都包含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对象?
答案 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"
}
]
}
}