我目前正在尝试使用flexjson对json字符串进行启用并将其映射到我的对象模型Android应用。该应用程序是一种具有多个供应商的库和其中的文件。JSON是从我没有影响的Web服务中获取的,看起来像这样:
{
"library":{
"vendor":[
{
"id":146,
"title":"Vendor1",
"catalog":[
{
"id":847,
"document":[
{
"id":1628,
"title":"Document",
...
},
{
...
}
],
"title":"Catalog ",
},
{
...
}
]
},
{
...
}
]
}
}
因此,每个供应商,目录,文档都由jsonobject表示,所有儿童目录和文档都在jsonarray中。到目前为止
LibraryResponse response = new JSONDeserializer<LibraryResponse>()
.use(Timestamp.class, new TimestampObjectFactory())
.deserialize(getLocalLibrary(), LibraryResponse.class);
return response.library;
我确实有一个具有List<Vendor>
的库对象。每个供应商都有List<Catalog>
和List<Document>
。
但不幸的是,如果目录仅包含一个文档或目录仅包含一个目录。因此,在这种情况下,JSON看起来像这样:
"document":
{
"id":1628,
"title":"Document",
...
}
现在,flexjson不知道如何进行挑选,我最终遇到了一个 List<HashMap>
而不是 List<Document>
。一个想法是明确地告诉Flexjson如何处理此类案例,但我不知道从哪里开始。另一种方法可能是手动解析初始JSON,并用适当的JSONARRAY替换此类JSONOBJECTS。但是我认为这样的方式并不好,因为图书馆可能会很深。
我希望您可以在这里提供一些指导。
yikes这是一些粗俗的json映射。那是什么后端编码器?#nothelping。
从查看代码来看,Flexjson被编码以将其从开箱即用。但是看来它不会将打字信息传递给绑定,因此它不知道其绑定到哪种类型中,因此它只是返回地图。那是一个 bug 应该修复的。好消息是。
无论如何,我能想到的最简单的事情是在该列表上安装 objectfactory 。然后,您可以检查并在供应流时查看是否获得地图或列表。然后,您可以将其包装在列表中,然后将其发送到适当的解码器。类似:
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;
}
}
}
}
我认为这大致是解决该错误的方法,但也应该解决您的问题。