将Jonobject映射到Java / Android中的Flexjson列表中



我目前正在尝试使用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;
             }
         }
     }
}

我认为这大致是解决该错误的方法,但也应该解决您的问题。

相关内容

  • 没有找到相关文章