首页 > 解决方案 > 如何从非列表格式的 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"]
  }
}

标签: javajsongson

解决方案


我建议您可以构建 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集合结构)

然后,无论您想要哪个地图作为列表,您都可以这样做(在Shards 的情况下)

new ArrayList<CoreNode>(replicas.values());


推荐阅读