Gson 序列化 Integer 对象

Gson Serializing the Integer object

我正在使用 Gson 库生成 JSON。我正在尝试生成 JSON,例如:

{"Plaintext":{"type":"List","value":["1","2","3","4"]},"SINGLE_FUNCTION":{"value":"1"},"IN_FLOW":{"value":10}}

然而,出现的 JSON 是..

{"Plaintext":{"type":"List","value":["1","2","3","4"]},"SINGLE_FUNCTION":{"value":"1"},"IN_FLOW":{"value":{"value":10}}}

我发现的问题是,当创建我的对象时,会存储一个 Integer 对象。这是因为映射的类型是 Object,这意味着我存储的 int 类型自动包装为类型 Integer 并且 Gson 正在呈现唯一的非空值, value 里面 Integer class.

我的问题是,有没有办法让 Gson 渲染一个 Integer 对象,就好像它是原始类型一样 int

编辑

所以,整个JSON就是一个Map。此地图定义为:

private Map<String, ParameterWrapper> parameterMap;

class ParameterWrapper 看起来像这样:

public class ParameterWrapper<T> {

    private String type;

    private T value;

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

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public T getValue() {
        return value;
    }

    public void setValue(T value) {
        this.value = value;
    }
}

我怀疑因为我没有为 ParameterWrapper 指定类型 T,它默认为 Object,这就是为什么 Gson 将其输出为 Object 而不是 int,尽管它是 Integer.

的实例

此示例代码(含lombok @Data and guava Lists):

package so28235867;

import com.google.common.collect.Lists;
import com.google.gson.Gson;
import lombok.Data;

import java.util.List;

public class Foo {

    public static void main(final String[] args) {
        final Root root = Root.of(Plaintext.of("List", Lists.newArrayList("1", "2", "3", "4")), new Value<String>("1"), new Value<Integer>(10));
        System.out.println(new Gson().toJson(root));
    }

    @Data(staticConstructor = "of")
    // TODO: tweak JSON serialisation to respect naming convention
    static class Root {
        private final Plaintext Plaintext;
        private final Value<String> SINGLE_FUNCTION;
        private final Value<Integer> IN_FLOW;
    }

    @Data(staticConstructor = "of")
    static class Plaintext {
        private final String type;
        private final List<String> value;
    }

    @Data
    static class Value<T> {
        private final T value;
    }
}

输出:

{"Plaintext":{"type":"List","value":["1","2","3","4"]},"SINGLE_FUNCTION":{"value":"1"},"IN_FLOW":{"value":10}}

这看起来就是您想要的。所以你的对象层次结构的定义可能有误。

My question is, is there a way of having Gson render an Integer object as if it were a primitive type int?

您可以手动将 IN_FLOW(或任何原始值)值添加为 Integer 原始值。

jsonObject.add("IN_FLOW",new JsonPrimitive(obj.getInFlow()));

改变这个,

public T getValue() {
    return value;
}

到,

public T getValue() {
    if( value instanceOf Integer ) {
        return value.intValue();
    }
    return value;
}