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