Gson序列化Integer对象

时间:2015-01-30 12:22:54

标签: java json gson

我正在使用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

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

修改

所以,整个JSONMap。此地图定义为:

private Map<String, ParameterWrapper> parameterMap;

班级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;
    }
}

我怀疑是因为我没有为T指定类型ParameterWrapper,它默认为Object,这就是Gson将其输出为Object的原因int,而不是Integer,尽管它是{{1}}的实例。

3 个答案:

答案 0 :(得分:1)

此示例代码(包含lombok @Data和番石榴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}}

这看起来像你想要的。因此,您可能在对象层次结构的定义中出错。

答案 1 :(得分:0)

  

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

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

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

答案 2 :(得分:0)

改变这一点,

public T getValue() {
    return value;
}

要,

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