Json从内部映射到java对象 - 嵌套的json属性

时间:2017-12-06 13:18:47

标签: java json elasticsearch jackson gson

假设我有JSON如下。

{
    "took": 1,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 1,
        "max_score": 1,
        "hits": [
            {
                "_index": "users",
                "_type": "students",
                "_id": "AWAEqh945A0BWjveqnd0",
                "_score": 1,
                "_source": {
                    "college": {
                        "sport": {
                            "name": "cricket",
                            "category": "batsman"
                        }
                    }
                }
            }
        ]
    }
}

我想将数据映射到从_source字段开始的College对象。

有没有办法对杰克逊或者Gson说从哪里开始绘图? 在这个例子中来自_source

我们从ES服务器获得的响应。 AWS上托管的ES服务器。 所以我们假设通过ES Java API RestClient进行通信。 是否可以通过ES Java API QueryBuilder查询。 什么是推荐。 ?

2 个答案:

答案 0 :(得分:0)

您可以使用Gson执行以下操作:

    JSONObject object = new JSONObject(s); // s is you String Json
    JSONObject hits1 = object.getJSONObject("hits");
    JSONArray hits = hits1.getJSONArray("hits");
    for (Object jsonObj : hits) {
        JSONObject json = (JSONObject) jsonObj;
        JSONObject source = json.getJSONObject("_source");
        College college = new Gson().fromJson(source.getJSONObject("college").toString(), College.class);
    }

你还需要这两个Pojos:

public class College {

    private Sport sport;

    public College() {
    }

    public Sport getSport() {
        return sport;
    }

    public void setSport(Sport sport) {
        this.sport = sport;
    }
}

public class Sport {

    private String name;
    private String category;

    public Sport() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCategory() {
        return category;
    }

    public void setCategory(String category) {
        this.category = category;
    }
}

答案 1 :(得分:0)

我用下面提到的方式。

 ObjectMapper objectMapper = new ObjectMapper();
 JsonNode jsonNode = objectMapper.readTree(resultJson);
 String sourceString = jsonNode.at("/hits/hits/0/_source").toString();

 College college = objectMapper.readValue(sourceString, College.class);