HTTPClient and JSON Parse

HTTPClient and JSON Parse

Recently, I get a request to monitor a SOLR cluster status, we can easily get the content from this URL
http://alljobs.us-east-1.elasticbeanstalk.com/solr/admin/collections?action=CLUSTERSTATUS

The JSON response will be similar to this:
{
  "responseHeader":{
    "status":0,
    "QTime":6},
  "cluster":{
    "collections":{
      "allJobs":{
        "pullReplicas":"0",
        "replicationFactor":"1",
        "shards":{"shard1":{
            "range":"80000000-7fffffff",
            "state":"active",
            "replicas":{
              "core_node-690563414":{
                "core":"allJobs_shard1_replica_n-673720407",
                "base_url":"http://172.23.2.92:8983/solr",
                "node_name":"172.23.2.92:8983_solr",
                "state":"active",
                "type":"NRT",
                "leader":"true"},
              "core_node-741092435":{
                "core":"allJobs_shard1_replica_n-724249428",
                "base_url":"http://172.23.2.66:8983/solr",
                "node_name":"172.23.2.66:8983_solr",
                "state":"active",
                "type":"NRT"}}}},
        "router":{"name":"compositeId"},
        "maxShardsPerNode":"1",
        "autoAddReplicas":"false",
        "nrtReplicas":"1",
        "tlogReplicas":"0",
        "znodeVersion":7088,
        "configName":"allJobs"}},
    "live_nodes":["172.23.2.66:8983_solr",
      "172.23.2.92:8983_solr"]}}

First of all, my colleague shows me the HTTPClient Fluent API, it really much easier and nice.
https://hc.apache.org/httpcomponents-client-ga/tutorial/html/fluent.html

Then I found I may only need to parse parts of the JSON. Some people may use this library to do that.
https://github.com/json-path/JsonPath

But we may still want to keep using the jackson mapper. Here is the UNIT tests and Implement class for that.

package com.sillycat.jobssolrconsumer.util;

import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonUtil {

static ObjectMapper mapper = new ObjectMapper();

public static void readPartOfInfo(String json) {
    JsonNode root;
    try {
        root = mapper.readTree(json);
        JsonNode nodes = root.findPath("replicas");
        for(JsonNode node : nodes){
            String url = node.get("base_url").asText();
            String status = node.get("state").asText();
            System.out.println("---------" + url + " " + status);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public static Map<String, String> convertJson2HashMap(String json) {
    Map<String, String> result = null;
    try {
        result = mapper.readValue(json, new TypeReference<Map<String, String>>() {
});
    } catch (JsonParseException e) {
        e.printStackTrace();
    } catch (JsonMappingException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return result;
}

public static List<Map<String, Object>> convertJson2ListOfHashMap(String json) {
    List<Map<String, Object>> result = null;
    try {
        result = mapper.readValue(json, new TypeReference<List<Map<String, Object>>>() {
    });
    } catch (IOException e) {
        e.printStackTrace();
    }
    return result;
}

}

The UNIT class will be as follow:
package com.sillycat.jobssolrconsumer.util;

import java.util.List;
import java.util.Map;

import org.junit.Assert;
import org.junit.Test;

import com.amazonaws.util.Base64;

public class JsonUtilTest {

    @Test
    public void dummy() {
        Assert.assertTrue(true);
    }
   
    @Test
    public void testReplica(){
        String compressData = "ew0KICAicmVzcG9uc2VIZWFkZXIiOnsNCiAgICAic3RhdHVzIjowLA0KICAgICJRVGltZSI6Nn0sDQogICJjbHVzdGVyIjp7DQogICAgImNvbGxlY3Rpb25zIjp7DQogICAgICAiYWxsSm9icyI6ew0KICAgICAgICAicHVsbFJlcGxpY2FzIjoiMCIsDQogICAgICAgICJyZXBsaWNhdGlvbkZhY3RvciI6IjEiLA0KICAgICAgICAic2hhcmRzIjp7InNoYXJkMSI6ew0KICAgICAgICAgICAgInJhbmdlIjoiODAwMDAwMDAtN2ZmZmZmZmYiLA0KICAgICAgICAgICAgInN0YXRlIjoiYWN0aXZlIiwNCiAgICAgICAgICAgICJyZXBsaWNhcyI6ew0KICAgICAgICAgICAgICAiY29yZV9ub2RlLTY5MDU2MzQxNCI6ew0KICAgICAgICAgICAgICAgICJjb3JlIjoiYWxsSm9ic19zaGFyZDFfcmVwbGljYV9uLTY3MzcyMDQwNyIsDQogICAgICAgICAgICAgICAgImJhc2VfdXJsIjoiaHR0cDovLzE3Mi4yMy4yLjkyOjg5ODMvc29sciIsDQogICAgICAgICAgICAgICAgIm5vZGVfbmFtZSI6IjE3Mi4yMy4yLjkyOjg5ODNfc29sciIsDQogICAgICAgICAgICAgICAgInN0YXRlIjoiYWN0aXZlIiwNCiAgICAgICAgICAgICAgICAidHlwZSI6Ik5SVCIsDQogICAgICAgICAgICAgICAgImxlYWRlciI6InRydWUifSwNCiAgICAgICAgICAgICAgImNvcmVfbm9kZS03NDEwOTI0MzUiOnsNCiAgICAgICAgICAgICAgICAiY29yZSI6ImFsbEpvYnNfc2hhcmQxX3JlcGxpY2Ffbi03MjQyNDk0MjgiLA0KICAgICAgICAgICAgICAgICJiYXNlX3VybCI6Imh0dHA6Ly8xNzIuMjMuMi42Njo4OTgzL3NvbHIiLA0KICAgICAgICAgICAgICAgICJub2RlX25hbWUiOiIxNzIuMjMuMi42Njo4OTgzX3NvbHIiLA0KICAgICAgICAgICAgICAgICJzdGF0ZSI6ImFjdGl2ZSIsDQogICAgICAgICAgICAgICAgInR5cGUiOiJOUlQifX19fSwNCiAgICAgICAgInJvdXRlciI6eyJuYW1lIjoiY29tcG9zaXRlSWQifSwNCiAgICAgICAgIm1heFNoYXJkc1Blck5vZGUiOiIxIiwNCiAgICAgICAgImF1dG9BZGRSZXBsaWNhcyI6ImZhbHNlIiwNCiAgICAgICAgIm5ydFJlcGxpY2FzIjoiMSIsDQogICAgICAgICJ0bG9nUmVwbGljYXMiOiIwIiwNCiAgICAgICAgInpub2RlVmVyc2lvbiI6NzA4OCwNCiAgICAgICAgImNvbmZpZ05hbWUiOiJhbGxKb2JzIn19LA0KICAgICJsaXZlX25vZGVzIjpbIjE3Mi4yMy4yLjY2Ojg5ODNfc29sciIsDQogICAgICAiMTcyLjIzLjIuOTI6ODk4M19zb2xyIl19fQ==";
        byte[] base64decode = Base64.decode(compressData);
        String jsonstring = new String(base64decode);
        JsonUtil.readPartOfInfo(jsonstring);
    }

    //@Test
    public void testConvertJSON2HashMap() {
        String compressData = "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";
        byte[] base64decode = Base64.decode(compressData);
        byte[] uncompressData = CompressUtil.gzuncompress(base64decode);
        String jsonString = new String(uncompressData);
        List<Map<String, Object>> list = JsonUtil.convertJson2ListOfHashMap(jsonString);
        Assert.assertNotNull(list);
        Assert.assertNotNull(list.get(0));
        Assert.assertNotNull(list.get(0).get("action"));
        Assert.assertEquals(list.get(0).get("action"), "delete");
    }

}


References:
https://hc.apache.org/httpcomponents-client-ga/tutorial/html/fluent.html

猜你喜欢

转载自sillycat.iteye.com/blog/2399747
今日推荐