我正在使用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
?
修改
所以,整个JSON
是Map
。此地图定义为:
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}}的实例。
答案 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;
}