我目前正在尝试使用Flexjson反序列化JSON字符串并将其映射到我的对象模型
Android应用程式。该应用程序是一种具有多个供应商的库,这些供应商可以具有一些目录和更多目录
和其中的文件。 json是从对我没有影响的Web服务中获取的,看起来像这样:
{
"library":{
"vendor":[
{
"id":146,
"title":"Vendor1",
"catalog":[
{
"id":847,
"document":[
{
"id":1628,
"title":"Document",
...
},
{
...
}
],
"title":"Catalog ",
},
{
...
}
]
},
{
...
}
]
}
}
因此,每个供应商,目录,文档都由JSONObject表示,所有子目录和文档都位于JSONArray中。
到目前为止,一切都可以与Flexjson和以下反序列化代码一起正常使用:
LibraryResponse response = new JSONDeserializer<LibraryResponse>()
.use(Timestamp.class, new TimestampObjectFactory())
.deserialize(getLocalLibrary(), LibraryResponse.class);
return response.library;
我确实有一个具有
List<Vendor>
的Library对象。每个供应商都有一个List<Catalog>
和List<Document>
。但是不幸的是,如果目录只包含一个文档,Web服务会将JSONArrays绑定(bind)到简单的JSONObjects。
或一个目录仅包含一个目录。所以在这种情况下的json看起来像这样:
"document":
{
"id":1628,
"title":"Document",
...
}
现在Flexjson不知道如何反序列化,我最终得到一个library.vendorX.getDocument()作为
List<HashMap>
而不是List<Document>
。一种想法是明确地告诉Flexjson如何处理这种情况,但是我不知道从哪里开始。另一种方法是手动解析初始json,然后将JSONObjects替换为适当的JSONArray。但是我认为这种方法并不是很好,因为库可能很深。
希望您可以在这里提供一些指导。
最佳答案
好像这是一些粗糙的json映射。那是什么后端编码器? #NotHelping。
从代码来看,Flexjson被编码为开箱即用。但是看起来它没有将类型信息传递给绑定(bind),因此它不知道绑定(bind)的类型,因此它只是返回一个Map。这是一个错误,应该修复。 好消息是有关的工作。
无论如何,我能想到的最简单的事情是在该列表上安装一个ObjectFactory。然后,您可以检查并查看反序列化流时是否获得了Map或List。然后,您可以将其包装在一个列表中,并将其发送到适当的解码器。就像是:
LibraryResponse response = new JSONDeserializer<LibraryResponse>()
.use(Timestamp.class, new TimestampObjectFactory())
.use("library.vendor.values.catalog.values.document", new ListDocumentFactory() )
.deserialize(getLocalLibrary(), LibraryResponse.class);
然后
public class ListDocumentFactory implements ObjectFactory {
public Object instantiate(ObjectBinder context, Object value, Type targetType, Class targetClass) {
if( value instanceof Collection ) {
return context.bindIntoCollection((Collection)value, new ArrayList(), targetType);
} else {
List collection = new ArrayList();
if( targetType instanceof ParameterizedType ) {
ParameterizedType ptype = (ParameterizedType) targetType;
collection.add( context.bind(value, ptype.getActualTypeArguments()[0]) );
} else {
collection.add( context.bind( value ) );
return collection;
}
}
}
}
我认为这大致可以解决该错误,但也应该可以解决您的问题。
关于java - 在Java/Android中使用Flexjson将JSONObject映射到列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13159809/