gpt4 book ai didi

java - 在 Java/Android 中使用 Flexjson 将 JSONObject 映射到列表

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:17:24 27 4
gpt4 key购买 nike

我目前正在尝试使用 Flexjson 反序列化 JSON 字符串并将其映射到我的对象模型安卓应用程序。该应用程序是一种具有多个供应商的图书馆,可以有一些目录和更多目录以及其中的文件。 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> .每个供应商都有一个 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com