Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Gson到json将映射动态添加到对象_Java_Json_Serialization_Jackson_Gson - Fatal编程技术网

Java Gson到json将映射动态添加到对象

Java Gson到json将映射动态添加到对象,java,json,serialization,jackson,gson,Java,Json,Serialization,Jackson,Gson,我有一个表示事件的对象,我希望使用gson或另一个库将其序列化为json,如果这样做更容易的话 我想在json中添加以下类型的字段: private Map<String, String> additionalProperties; 看起来是这样的: additional_properties: {"value1":1,"value2":"abc"} 我只想以以下形式附加到事件对象: {"value1":1,"value2":"abc"} 下面是一个输出示例-添加的其他属性是对

我有一个表示事件的对象,我希望使用gson或另一个库将其序列化为json,如果这样做更容易的话

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

private Map<String, String> additionalProperties;
看起来是这样的:

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

如果你的
事件
类是这样的

class Event {
    private Map<String, Object> additionalProperties;
}
预期和有效输出为:

{"additionalProperties":{"value1":1,"value2":"abc"}}
如果您想要输出,例如

{"value1":1,"value2":"abc"}
你可以打电话

String json = gson.toJson(event.additionalProperties);
我只想在下面的示例中附加到事件对象 表格:


这样,如果将该值直接附加到json对象,它将不是有效的json变量。您最好在

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

在事件类中: 将两个对象放在一起:
感谢您的回答-这是我已经考虑过的,但是我还有其他变量,我想在事件对象中序列化为json,并且toJson不接受两个对象参数。为了澄清您的问题,您已经共享了一个json文本(编辑您的帖子)。但我不明白它应该向我们展示什么。更清楚地说,你能分享两个JSON吗,一个告诉我们你有什么,另一个告诉我们你想要什么。好的,没问题,完成了!
{"additionalProperties":{"value1":1,"value2":"abc"}}
{"value1":1,"value2":"abc"}
String json = gson.toJson(event.additionalProperties);
{"value1":1,"value2":"abc"}
@JsonIgnore
    private Map<String, Object> additionalProperties;

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

    public void setAdditionalProperties(Map<String, Object> additionalProperties) {
        this.additionalProperties = additionalProperties;
    }
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);