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 = "eJztWgtz27aW / isYdWcnnVVkPkQ93Da7iuzU7o0t14 + bydYdD0hCEiKSoPmQLN / Z / 77fAUiJsp3EeezsTu92prFIAAcH5 / mdA / 7xjxYPCqmS1n4rFJEoRKvdCsq8ULHIbmTY2u8N261UqUg / 2IN + u5WrMgvE9jngccrlLGnMELNYJIV + YbVbH5R / k4mpyEQSCGw0nvTfHcnl8E00XP1uue9m8VKNR3d + 9 / x9t3cCBgpZRDRxdHByfHp8cXk + ujz ++ yEbXVzgYXR6iSmhyINMphXrP88dlhfrSPxy3SrEXfGSR2BonwXgQmQ / Xbde / ZwXmUpmr36bvGaTs8PT49Nf2ej0dHJ1Oj48OTy9 / Pl6r5qBX3Pn1fMpjsJYJhIPvJBLwUZ5jgeeFI8ops8keKbyQiYzdsALsb + lwi5EWojYFxlzvDZzLLuPwfTzdFlN + ECkPCtIM02yTf5V8jySNcVzkaqsyFmhmhTfyIRD0 + xAZiIoVPZlNC94xLM1O + fJbOf4 / 2L3OpYFUcL82MHksPNlZCFVSQdkl + t0h + 4ZZPLyUsbiy + gdqRWOzUZpGq13xIkXMtCyzBlfchlxPxKMF / sbPcCBivlKQJOBLNadQMXXe / gnLhM8Xu + JOI3UmtS0Y0LP4O1CJGGTgTY7F3kZizbjGBirJWwHPo7ZpDF2VMY8oSnaofM2s3uWxQ7ZBfHH3hGD7CBrN5 / b7OqSDbpdyzMczd1niutA8DCSidjKjE1SkbAyKWTEpjKKRLjrMe5zLPtTTHxAGJPTdZOLCSSwlGK1 / 8ytGiTORDZVWQydsiXPpCjWTE0Z33X + vEzJIViaKQg0Jy8mycdcJgX + p + e5FnpWCb3N0tKHuthKZYvc6ElvCvcJMKNgQSSyBeYHKgvzDpSIv / CvQsDr5oIGslJqp9aLcwRxHdBrHtqYQkemvRGIWSNwvsh / bG94y5mxOyFIGyL / Cftvt5oLHhXzNovkVOh9QplzX0YwWIa1ZaYdXiSZiiLiBZzCrlL4gCTrh + Q0t7nCWWWhjVOTCTC / 4pekGUXMl2GueS8zETK898WcR1MaJgpj8phNzBJZzvxSRiGdLhVZLAum8Ne4Hx0hTlUO / mMRK4gihkD4TFSCNq4AVk3MNgL9rZL + Wet / RKW / KRB / UgT8KmIFzxdarIGAzvErUrOKopYcBIJ9iaP6qHl1VgiYpA3GcMClhCrYTCRgN2J1zoUCYaGB9hNix5hH50sN / W + + JWsGjZjCwiwWcy3AwAcWMjec8Q9LHaeik Vf4wkSLWJAv0KFKCihEX0KG5Byq1CqcZTyGdDe8kA6385tx8sWJDDKVq2nB3sHo2uzwLhBRm03KIlJq0WbH5PKJKGCwIDyFEZHBy4QV6xSSbjNzArzBPHCXq4SEaoKq2YXlWhBGUSTa2n4h6doJsCKZQi8ISlguE / J4vbgDjkBWEoJhpXbsMYevRdobrvdg32MFgTI6w4pnUJxGPLDhL9bd7yXGprVsvkI9v2Y8LM2Zp5mK2ZGczdlFMAeKg + VFJWSgEIlf2D8aK8vg8y / cH9lacPgTlCS2Z4VMjs43Z9z4wIO4F5aFFFD1CZhgc443nF0VfI70ISnp5OwtbDrJxc6UcElRI6wUQ1utMqmhj / FbaSSvV / ikr0i7RcpzsjwI + OU2VbIwK2cMNlkYBStf65OzHBzmU044ZM18HixmmSoxQQcxcEfbmejKgrkIFpW6 / AZ6SHnyCmPwwJB5jpjO+XwmFmo1+BCsA69r367v76JZUqxsUhLNpnVAp2UWAZXOiyLN96/3rvf8ThWnFWJFlfF9wWFtyPxwg8X13qfpY7qECsq7KLAz1w2n0WKd3M3ErctLu+sMVuquyK73/r0s4huTWX5BsM+dAKYIb/hXeh+LUJbxL0Ea6Mcatu9MJPQP2fNkbdB8r+s69nDzEodqggMKxrRCkvZb+3+0JjP4TvvqsvUnigDEPqoSaKDr4cW9TAMV6okaQeAVeMEmXruVidnN5gGqLwTt7lm9njfsDrqYmQm+edkdOpaFwmJrp619Bztq5KinYCwsjQfpIZwRkcJMk0kIi6KJLctpbZ8rXuklWLslLyzWNzlMA+tckPQVGLsxttTa73b6rjMAe643tIagm/IyJw5dzCwR7orWflJGEVhBeCF7wF7pHJ5nfuZZgDqpUTRlAalEv2jZVAXxGfFDooRjBvPtcwh6aygwTbVEwOztTVxGhURIFZmpuZzghkLsWj/F/IPKsKAQM0UHp0NCghYddHesPu8fNg3J5Illtlm2M7azbLug9aA4ut7TGZVCCNVwEqkYUmpNgyB0hT9wQouH0+HQ5iK0fe5OB7bXdYJQ13thmd5sVvT73PbcfhDYAzH0rdDqDXuuP7CnVjDoOdwjteY3hUpvAEKKm9RgIC2LiEOJZRqCyV0TwwKYia94ZoS6WW0sx2q8qUzGWP2feikPTbELK76ZI+C29ousFJCTQpoRN1Oy05DUAcp8CqAgyT0oGKV6nbgLohKnvNm42pRHuWgYIuKnJCluRqiuluFNDD0jisEiva416Ht9x6kt8FJz3np7/Obw8vjksGW8sgTXrcnV5c3kzc3rq4NfD6mgXoj1iiCmMU4tbjIuvdV/tf832gSHvwW3+VkQfLiwe6+vBkv5azw7j47ig/VFMrAbbQID0nBWGNrj1kD6qjnOLpH5RxHCFBtjb4JeJjOiWiWNBkAVyC5BgGJbw/cmTCEYy7cFI2sS7tSFF3JRvMlxG7gDc+OMNlxX6a6jOWmQ1/s26kW2Wq06nDjNNYN5R2Wzj2Wnhe/cWh8+9JfxgFu+TG/v7Ntlf9Bb3IX3SfTt2enT9KvsNOvFCx4vlnNHxuEsVkWY+2Gi4nA1c5P775+dvK7r2m4zOT2l2HwnQ+kZ7dP3DzOU+yBD2V3L6j47QzmD3Qzl9dyu0+t9NEO5/5+g/gcTlPPdE5Tf7w2m3cAPbFt4yFL+oB8OHTt0+IALq9t/nKDswPF7nju0pkO3H/r94TQIA+5Y4UCIodfjX5qgyML+AgnKGeA/13P/EgnqXXk7vftt1Pf9g9M7t7h6Pz8bWbF/tY4W7njcSFBnEWWFEyoyhWmNospdwBGeSFZn4xG7WCO8xDllBNTOn85G+Vyian68w0rvQHmEqnLEBFPsIs8coRyn6me0FEmpK7xRiEK9zU5GHXaWyZjar9QqyuoODi2FKbEVEhd1N8gOGGrSEpkqR4wtdAmeCYgv2za8Kkaqvk4sgjlPTPGIGbpNZWpJcVvKNK7reSTFmCclBbEy02dGXDXJMi8D6mhNS1T2oCHJQxq5NtUyaG7dqGMf7EmPK2H6Rs1ZO4X7o8oTiiip8RGtTTMHZoZqFKtJ2NtWGmrOKfUHddMnEjzRygB72IGuBkI4MMQNwiTQuklYb0JzGbVqC4IYulmhKlXon3xKeEJ3wXGSqrOjdGfnkcJ4jncQrz7NA8viLFJEADaxSoRpT8Gt6 / 6ZbqYYy2C5JOHYw6HbQeXX0A9JSyGPwcIotWiTXHHiL4Xy6h4GlAozJNlCe1Vvher4TBVQSN0BNS3GhtDohLp9QC02vhDmpIhqQreV3pFpQVN6Xt27rFtSopCmIWsuE + r2WybmFKQw4ItETMkzUh4s + MwImljk0Yqvc0ZtJ5IBnQjBVC5liDCXm1YgGWnBo03P1fQvaknT2YCdYGk + oB89aV3hjYS / hQwhdVUdtLLoDvsIrIuLD6kcZgB + Ug4Xab / bz5bLInOCpD8r3G + HDZ + mX8G65b0KbPeeR0rY1nDlLMtIlfnqzrWll / HoD + u6bq + / g + qOVEQBaxfH6ZB1MnqI4xxrF8e1LNsxeOB5SK7nPUByfa9nWYOv6jXYO1Cuaz0B5fRLm8pVa / hPAOq6ngZ17ZbTrX5Y3udgXtvqDHv4p / ck3iOK / Zpit6bY / xQCrOhBeCDa3YWDTdA38L1B3 + 9zEISw + 77thf6wG4gg8Iae7 / cegz7ftrsD1 + kGLgc09Hi / 5wwC13IG / tAJLLv3paCPKoi / AugbDh2n734j6OMlwJyirdqU + KRPmbj96OKkzULJZ4kCK1tk0WZTiWy / nbNFI / iN6L3KIJyixjDtHXDzfwRtLp13rnXlefzOFgfj / zxYyfevF / Lq9cVwKu1pA23W1 + 50a7K5wGCXOHGiM8FTqNOkHf3v5nZhioz1Mpf3Yp / Z3fROX / xkxVydvgfeomRMUCGpkyQejy83V / 5sNVcGLvpiC0saN4EEcAgWEmhLNHxEEoJG7ms4JO5EUDYvBp8 + DJuWSWDwMKXmCkGmdMEFRSOx + + hmKulf1n to5f3k6pyNj0Zv3x6e / nrYuGGpptWJdfsXIiqjVz9H8vNCMjIArsr01xF0oOoybzyXYsoOzckAQibwuIAu1WlwR3qQ3D5rbE / 7PmfvQ7qLFQZwEdEa1OVEXibTDGEmKw10i4Wo7jwTIcK8vmGt9GAETde0zOle7 / Wv99yex3yeS8AVwyhcDcY / IxSuQT + Mt9IuNoNLT6f6bg3b7BCt4He4 + RrF7N / 5mvOOQG19Lyo4fsd8upsDoqqOhAhLgBOgy19rxpArM7b51qJxr0X3iQZg0mVQDLawHHUE7EwXDLmKtDV + HZvnOtAjWGlk0WYm0FcQ0HwyoG2eTDzQ4qtu7yvQq59CKA1Q2NRfZFW + qrDosVEsKZXvfgGSs1BRWaLv4w0Pjb2RtVB1yHyOWUFJqqhuDSGSx / aiEXKDdIcdVvxq6UtTdhI + xloNgKlp + TXiog6rDGRKfJIFwvvnyH / 6XlXLrL5kFUselY0r9k0FhtI2VAZ0UyigW18SZm7qPWk + sKomZSIyJOYyzR / IJREruivVlRSZFNVRX3GgyWfLs + u9j5C / 3qO4s4nQdRz7zIY7ge73qxFy7fF4dHk8Ob34ztHuNQ / mIlJ0x3sgZnSVrE1g8G / b62SYwxY9t824bVXj2qrqm + DQUGiU4F9jPSdnjOKQqH03oFp6U4yi5pqT5MfHFxdn37jVyUUVw9tNp9tU2Sc8QWlJfvWT + has not + eqsSk2NwWo + 3WlH5dd5jP5eQhekjz4kqapTbjolOPgKM + mv2Kyha3fEOq0L5GX / 0acTWmWc5ph6XkFT8LPo6 / STSahn9xsDcIdCUQdaUWjn / LhidjyCyRC7IN1a1o35d6yo / 1OcUbsFlWMostc8F0+8PifId/Ob8g/0WQhmm1+X3L8AjE5tcqQvdLjJ5dHhOTs+fTM5P9H+1nAyM+NyLpGY6q8Ra4yExAr7l6brMYp83YnRprXBMJcZXwqaXKyEMFERzkXzzUTd1dk0IZoBaxcD1dJ87pEuJ2x0dvb2PXt0FP29YdD8rFAbStV0qViJG5mVPkbcf8DPiaQAItjrTCaLmCdtdnF0fvLyYnxWTzSwabLpS1WwqR62HZsdggdwwM4VD9u1/ABUqfj32MOTczaHdeHUVCIXar/T6fyHImibmDZJi3IChhM1VVGkVloYn5HWAxoNm+WfX1xz+Ibf7bMXnj34kf3www8v8f8PD6T1dwnD0VeDjc3IISNE04TFilKkr8pCG0YskfKqT+2o7WQc62lsfAYKObCgKjb40Riq6QVSK7ogo3upAYhuolWI8cleMVz8dudDpnr29sOe3f2r2qLN3r490/3JhB0SBSieAJIBbIemz5d1nk5ajxpoM89Ji9t1fB/P58nd/Xxh9daD+9XdLQBN4Hx7A+3T9KsGWtyLhr2gcHNhWQH/MLOCfrwQ98lMRh8W8fdvoA2sXtfpNTtolWwf3ISSkzznKpR86LkNNM9xHzTQukOnR121ZgOt+9GrUO+j/TPXe6J/pl+63X+G1plVt87cz3bMnr4aJQp2TaH36Q7ZYNDGPw+aY8Bx13vsogbf9NsAnWbXzEI49ofD0B9Mue37wyC0QjuY2sOu4w6tPn/cNfN4f2ANPdsLBgFqzH7Y73lWtzdwhOUNHMv9wq6ZtsC/QtesNxwMXKv3bV2zQOdOUbccUILuvqiwQ1YPNL55fThUbJsu2xGFYrFMQvodbvpOVHbrr2jbgHMJob3tmMakmwmPe2t//jeW5hP4";
        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

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=326174307&siteId=291194637