Gson to json动态地将地图添加到对象

时间:2014-10-22 18:07:38

标签: java json serialization jackson gson

我有一个对象,它表示我想要使用gson或其他库序列化为json的事件,如果这样做更容易。

我想在json中添加以下类型的字段:

private Map<String, String> additionalProperties;

还有另一个用例:

private Map<String, Object> additionalProperties;

但是如果我将AdditionalProperties添加到Event对象,并以正常方式构建Gson:

Gson gson = BUILDER.create();
String json = gson.toJson(event);

看起来像是这样:

additional_properties: {"value1":1,"value2":"abc"}

我只想以下列形式附加到事件对象:

{"value1":1,"value2":"abc"}

以下是一个示例输出 - 添加的其他属性是对象'z'和对象'广告客户':

{"organisationid":"2345612ß","projectid":"12345678",
"place":{"placeId":"2345","last_place":"123-3"},
"advertiser":{"advertiserId":"2345a","code":"a123-3"},
"user":{"isY":false,"isHere":false,"isBuyer":false},
"x":{"identifier":"SHDG-28CHD"},
"z":{"identifier":"abcSHDG-28CHD"},
"event_type":"x_depart"}

以下是目前的情况:

{"organisationid":"2345612ß","projectid":"12345678",
"place":{"placeId":"2345","last_place":"123-3"},
additionalproperty: {"advertiser":{"advertiserId":"2345a","code":"a123-3"},
"user":{"isY":false,"isHere":false,"isBuyer":false},
"x":{"identifier":"SHDG-28CHD"},
additionalproperty: {"z":{"identifier":"abcSHDG-28CHD"}},
"event_type":"x_depart"}

2 个答案:

答案 0 :(得分:2)

解决此问题的最佳方法是使用动态添加属性的框架,但如果没有这个,您可以将其他属性添加到Event对象中(包括@JsonIgnore) 因此它不是最终json的一部分),从其他属性创建一个新的JSONObject,并在序列化为json之前将其合并到事件JSONObject。这样,附加属性将动态添加到生成的事件输出中。

在Event类中:

@JsonIgnore
    private Map<String, Object> additionalProperties;

    public Map<String, Object> getAdditionalProperties() {
        return this.additionalProperties;
    }

    public void setAdditionalProperties(Map<String, Object> additionalProperties) {
        this.additionalProperties = additionalProperties;
    }

合并两个JSONObjects的函数:

public static JSONObject mergeObjects(JSONObject source, JSONObject target) throws JSONException {
    for (String key: JSONObject.getNames(source)) {
            Object value = source.get(key);
            if (!target.has(key)) {
                // new value for "key":
                target.put(key, value);
            } else {
                // existing value for "key" - recursively deep merge:
                if (value instanceof JSONObject) {
                    JSONObject valueJson = (JSONObject)value;
                    deepMerge(valueJson, target.getJSONObject(key));
                } else {
                    target.put(key, value);
                }
            }
    }
    return target;
}

将两个对象放在一起:

 String jsonAdd = mapper.writeValueAsString(additional);
 String jsonEvent = mapper.writeValueAsString(event);

 JSONObject jsonAddObj = new JSONObject(jsonAdd);
 JSONObject JsonEventObj = new JSONObject(jsonEvent);
 JSONObject finalJson = Merge.deepMerge(jsonAddObj, JsonEventObj);

答案 1 :(得分:0)

如果您的Event课程类似;

class Event {
    private Map<String, Object> additionalProperties;
}

你正在打电话;

String json = gson.toJson(event);

预期和有效的输出将是:

{"additionalProperties":{"value1":1,"value2":"abc"}}

如果您想要输出,例如;

{"value1":1,"value2":"abc"}

你可以打电话;

String json = gson.toJson(event.additionalProperties);
  

我只想在下面附加到事件对象   形式:

{"value1":1,"value2":"abc"}

这样,如果将该值直接附加到json对象,它将不是有效的json变量。如果您想要的json值在http://jsonviewer.stack.hu/

处有效,则最好先尝试一下