java - 如何从非列表格式的 JSON 对象在 GSON 中创建列表?
问题描述
我正在尝试将 JSON 对象转换为 POJO,理想情况下,我的对象中有一个对象列表(of collection
's)cluster
。然而,JSON 模式不使用列表,它使用collection
名称的映射,这是未知的并且可能会更改。有没有办法使用 GSON 将其转换为 POJO 列表?
有问题的JSON:
{
"responseHeader":{
"status":0,
"QTime":333},
"cluster":{
"collections":{
"collection1":{
"shards":{
"shard1":{
"range":"80000000-ffffffff",
"state":"active",
"replicas":{
"core_node1":{
"state":"active",
"core":"collection1",
"node_name":"127.0.1.1:8983_solr",
"base_url":"http://127.0.1.1:8983/solr",
"leader":"true"},
"core_node3":{
"state":"active",
"core":"collection1",
"node_name":"127.0.1.1:8900_solr",
"base_url":"http://127.0.1.1:8900/solr"}}},
"shard2":{
"range":"0-7fffffff",
"state":"active",
"replicas":{
"core_node2":{
"state":"active",
"core":"collection1",
"node_name":"127.0.1.1:7574_solr",
"base_url":"http://127.0.1.1:7574/solr",
"leader":"true"},
"core_node4":{
"state":"active",
"core":"collection1",
"node_name":"127.0.1.1:7500_solr",
"base_url":"http://127.0.1.1:7500/solr"}}}},
"maxShardsPerNode":"1",
"router":{"name":"compositeId"},
"replicationFactor":"1",
"znodeVersion": 11,
"autoCreated":"true",
"configName" : "my_config",
"aliases":["both_collections"]
}
},
"aliases":{ "both_collections":"collection1,collection2" },
"roles":{
"overseer":[
"127.0.1.1:8983_solr",
"127.0.1.1:7574_solr"]
},
"live_nodes":[
"127.0.1.1:7574_solr",
"127.0.1.1:7500_solr",
"127.0.1.1:8983_solr",
"127.0.1.1:8900_solr"]
}
}
解决方案
我建议您可以构建 POJO 模型,然后在导入数据后进行转换。
stackoverflow/model/CoreNode.java
:
package stackoverflow.model;
/**
* CoreNode
*/
public class CoreNode {
private String state;
private boolean leader;
private String core;
private String node_name;
private String base_url;
public CoreNode() {
super();
}
public String getState() {
return this.state;
}
public void setState(String state) {
this.state = state;
}
public boolean getLeader() {
return this.leader;
}
public void isLeader(boolean leader) {
this.leader = leader;
}
public String getCore() {
return this.core;
}
public void setCore(String core) {
this.core = core;
}
public String getNode_name() {
return this.node_name;
}
public void setNode_name(String node_name) {
this.node_name = node_name;
}
public String getBase_url() {
return this.base_url;
}
public void setBase_url(String base_url) {
this.base_url = base_url;
}
}
stackoverflow/model/Shard.java
:
package stackoverflow.model;
import java.util.Map;
/**
* Shard
*/
public class Shard {
private String range;
private String state;
private Map<String, CoreNode> replicas;
public Shard() {
super();
}
public String getRange() {
return this.range;
}
public void setRange(String range) {
this.range = range;
}
public String getState() {
return this.state;
}
public void setState(String state) {
this.state = state;
}
public List<CoreNode> getReplicas() {
return this.replicas;
}
public void setReplicas(List<CoreNode> replicas) {
this.replicas = replicas;
}
}
然后在您的主要功能中,Map<String, Shard>
为每个集合使用一个结构。(然后是Map<String, Map<String, Shard>> for the generic
集合结构)
然后,无论您想要哪个地图作为列表,您都可以这样做(在Shard
s 的情况下)
new ArrayList<CoreNode>(replicas.values());
推荐阅读
- list - 如何在颤动的列表中获取目录的内容
- c# - 我使用了使用 android studio 使用相同的调用方法声明的事件回调函数,并在 c# 中寻找等效的代码示例
- node.js - 通过节点和快递运行服务器时出错
- templates - Go html/template 自动 json 编码
- spring-boot - org.hibernate.exception.JDBCConnectionException:无法获取 JDBC 连接
- google-cloud-pubsub - 如何管理 GCP 权限以创建订阅并只允许删除此服务帐户创建的订阅?
- google-cloud-platform - 无法在 GCP Endpoints 门户上访问 Cloud Endpoints
- remote-access - 在 aws 设备场中使用远程访问设备时无法模拟位置
- upgrade - STm32L4R5VG 固件在运行时升级
- vb.net - 更改 For 循环中使用的变量