首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Genson阻塞了json服务的有效json输出。

Genson阻塞了json服务的有效json输出。
EN

Stack Overflow用户
提问于 2015-08-01 18:54:52
回答 1查看 550关注 0票数 0

我试图用Genson1.3从我的jax服务中反序列化一个json响应到一个对象列表,如下所示:

代码语言:javascript
运行
复制
[{"@id":1,"id":1,"size":200,"websites":[],"group":{"@id":2,"id":1,"volumes":[{"@id":3,"id":3,"size":100,"websites":[],"group":{"@id":4,"id":1,"volumes":[3,{"@id":5,"id":2,"size":100,"websites":[],"group":4},{"@id":6,"id":4,"size":100,"websites":[],"group":4},{"@id":7,"id":1,"size":200,"websites":[],"group":4}],"name":"ubuntu-dockerhosting-vg"}},5,6,7],"name":"ubuntu-dockerhosting-vg"}},{"@id":8,"id":2,"size":100,"websites":[],"group":2},{"@id":9,"id":3,"size":100,"websites":[],"group":2},{"@id":10,"id":4,"size":100,"websites":[],"group":2}]

我用jsonlint查过了,它是有效的。我试图用下面的代码将它反序列化为List<LogicalVolumeImpl>

代码语言:javascript
运行
复制
com.owlike.genson.GenericType<List<LogicalVolumeImpl>> type =
                new com.owlike.genson.GenericType<List<LogicalVolumeImpl>>(){};

List<LogicalVolumeImpl> volumes = null;
Genson genson = new GensonBuilder()
                .usePermissiveParsing(true)
                .create();
try {
       volumes = genson.deserialize(jsonString, type);
} catch (RuntimeException e){
       e.printStackTrace();
       System.out.println("Unable to parse: " + jsonString);
}

得到这个例外:

代码语言:javascript
运行
复制
com.owlike.genson.JsonBindingException: Could not deserialize to type interface java.util.List
at com.owlike.genson.Genson.deserialize(Genson.java:391)
at com.owlike.genson.Genson.deserialize(Genson.java:321)
at com.dockerhosting.client.DockerhostingClient$LogicalVolume.list(DockerhostingClient.java:372)
at com.dockerhosting.test.LogicalVolumeTest.hasLvs(LogicalVolumeTest.java:71)
at com.dockerhosting.test.LogicalVolumeTest.main(LogicalVolumeTest.java:33)
Caused by: com.owlike.genson.JsonBindingException: Could not deserialize to property 'group' of class class com.dockerhosting.client.impl.lvm.LogicalVolumeImpl
at com.owlike.genson.reflect.PropertyMutator.couldNotDeserialize(PropertyMutator.java:49)
at com.owlike.genson.reflect.PropertyMutator.deserialize(PropertyMutator.java:32)
at com.owlike.genson.reflect.BeanDescriptor.deserialize(BeanDescriptor.java:109)
at com.owlike.genson.reflect.BeanDescriptor.deserialize(BeanDescriptor.java:92)
at com.owlike.genson.convert.NullConverter$NullConverterWrapper.deserialize(NullConverter.java:56)
at com.owlike.genson.convert.DefaultConverters$CollectionConverter.deserialize(DefaultConverters.java:175)
at com.owlike.genson.convert.DefaultConverters$SingleValueAsListFactory$1.deserialize(DefaultConverters.java:224)
at com.owlike.genson.convert.DefaultConverters$SingleValueAsListFactory$1.deserialize(DefaultConverters.java:210)
at com.owlike.genson.convert.NullConverter$NullConverterWrapper.deserialize(NullConverter.java:56)
at com.owlike.genson.Genson.deserialize(Genson.java:389)
... 4 more
Caused by: com.owlike.genson.stream.JsonStreamException: Illegal character at row 0 and column 1 expected { but read '}' !
at com.owlike.genson.stream.JsonReader.newWrongTokenException(JsonReader.java:951)
at com.owlike.genson.stream.JsonReader.begin(JsonReader.java:427)
at com.owlike.genson.stream.JsonReader.beginObject(JsonReader.java:159)
at com.owlike.genson.reflect.BeanDescriptor.deserialize(BeanDescriptor.java:103)
at com.owlike.genson.reflect.BeanDescriptor.deserialize(BeanDescriptor.java:92)
at com.owlike.genson.convert.NullConverter$NullConverterWrapper.deserialize(NullConverter.java:56)
at com.owlike.genson.reflect.PropertyMutator.deserialize(PropertyMutator.java:30)
... 12 more

据我所知,这很可能是因为将"group“对象属性简化为对象的id ( "group”:2,而不是genson所期望的完全未包装对象)。

我能做什么?我试图在GensonBuilder中使用exclude(String字段)来排除group属性,但它产生了效果。

更新

LogicalVolumeImpl和VolumeGroupImpl的来源

代码语言:javascript
运行
复制
public class VolumeGroupImpl implements IVolumeGroup, Serializable {
Long id;
String name;
@Override
public Long getId() {
    return id;
}

@Override
public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}
}

public class LogicalVolumeImpl implements ILogicalVolume, Serializable{
Long id;

@JsonProperty("group")
VolumeGroupImpl group;
Long size;
@Override
public IVolumeGroup getGroup() {
    return group;
}

@Override
public Long getSize() {
    return size;
}

@Override
public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public void setGroup(VolumeGroupImpl group) {
    this.group = group;
}

public void setSize(Long size) {
    this.size = size;
}
}
EN

回答 1

Stack Overflow用户

发布于 2015-08-14 20:34:38

实际上你的映射是无效的。例如,我们可以看到group: 4这样的东西,其中4是一个数字,在您的类group属性中是一个VolumeGroupImpl类型的对象。

我想您是用某个库生成这个json的,它在ser/de期间处理对象引用,但是Genson没有,至少目前没有。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31765087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档