gson 从平面JSON数据创建自定义对象列表

ewm0tg9j  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(195)

我想从JSON中创建一个Adapter类型的数组列表,但是由于JSON不是数组列表格式,所以我无法使用gson.fromJson()方法。
有没有什么方法可以通过解析下面的JSON来创建我的自定义对象列表?
JSON数据:

"source":{"adapter-config.adapter[0].name":"testAdapter1",
"adapter-config.adapter[0].resolverName":"serviceResolver",
"adapter-config.adapter[0].parameters[0].key":"serviceId",
"adapter-config.adapter[0].parameters[0].value":"serviceIdPathInEvent",
"adapter-config.adapter[0].parameters[1].key":"appId",
"adapter-config.adapter[0].parameters[1].value":"appIdPathEvent",
"adapter-config.adapter[0].parameters[2].key":"env",
"adapter-config.adapter[0].parameters[2].value":"envPathInEvnet"}

我的适配器对象:

public class Adapter {
    private String name;
    private String resolverName;
    private List<KeyValuePair<String, String>> attributeList;
}
xriantvc

xriantvc1#

Gson没有提供这样的功能。但是你可以通过手动从JsonReader阅读JSON数据,使用nextName()使用JSON属性名,然后解析它们以确定它们代表的数据。你可以直接从JsonReader读取,或者如果显示的JSON数据只是从一个更大的JSON文档中提取的,您可以为List<Adapter>实现一个TypeAdapter。然后,可以通过提供new TypeToken<List<Adapter>>() {}.getType()作为类型,将TypeAdapter注册到GsonBuilder,或者您可以使用@JsonAdapter注解保存List<Adapter>的字段。
对于List<Adapter>的实际解析,我建议存储 * 当前适配器 *(以及它在列表中的索引)。无论何时解析JSON属性名称,都可以检查名称中编码的索引是否等于 * 当前适配器 * 的索引,然后修改现有示例。否则,如果编码索引等于 * 当前适配器 * 的索引+1,则创建一个新的适配器示例,请将其添加到适配器列表中并重新分配 current adapter 变量及其索引变量。然后继续解析属性名称的其余部分,以找出要设置的Adapter字段值。
(In如果你遇到了困难,请随时在评论中告诉我,我可以尝试提供一些具体的代码;但最好还是先自己尝试一下。)

相关问题