Search code examples
rest-assuredrest-assured-jsonpath

Get all Parent and Child Of Names in Json Resposne


I want to iterate Response Child one by one using Rest Assured Java

public void preemptivve() throws ParseException {   
        RequestSpecification request = RestAssured.given()
                .contentType("application/x-www-form-urlencoded; charset=utf-8")
                .formParam("grant_type", "client_credentials");
        Headers header = new Headers(BaseClass.list);
        request.headers(header);
        Response response = request.given().when().post("/getclientdetails");       
        response.then().assertThat().body("size()", is(4));
        
    
        String jsonString=response.asString();
        String accesstoken=JsonPath.from(jsonString).get("access_token");
        System.out.println(jsonString);
        System.out.println(accesstoken);
        
        org.testng.Assert.assertEquals(response.getStatusCode(), 200);  
        
        
    ObjectMapper objectMapper = new ObjectMapper();
        JsonNode jsonNode = objectMapper.readTree(reponse.asString());
        Iterator<String> fieldNames = jsonNode.fieldNames();

        while(fieldNames.hasNext()) {
            String fieldName = fieldNames.next();
            JsonNode field = jsonNode.get(fieldName);
            System.out.println(fieldName);
            System.out.println(field);
            
        }

    }

I am getting parent element..

Eg.,

"metadata": {
        "msgLst": [
            {
                "code": "00",
                "text": "SUCCESS"
            }
        ]
    }

I am getting metadata but i want msgLst, code and text as well.. How to get that..

I need to get the response element one by one by iterating to validate that response element is correct or not


Solution

  • I'm not sure what your actual goal is, but if you want to get all keys of json object using jackson then this code might work for you.

    private List<String> getKeys(JsonNode node, List<String> allKeys) {
        Iterator<Map.Entry<String, JsonNode>> fields = node.fields();
        while (fields.hasNext()) {
            Map.Entry<String, JsonNode> next = fields.next();
            allKeys.add(next.getKey());
            JsonNode value = next.getValue();
            if (value.isObject()) {
                getKeys(value, allKeys);
            }
            if (value.isArray()) {
                if (value.size() > 0) {
                    JsonNode jsonNode = value.get(0);
                    getKeys(jsonNode, allKeys);
                }
            }
        }
        return allKeys;
    }
    

    I tested with your sample json:

    @Test
    void SO_69436972() throws JsonProcessingException {
        String json = "{\n" +
                "  \"metadata\": {\n" +
                "    \"msgLst\": [\n" +
                "      {\n" +
                "        \"code\": \"00\",\n" +
                "        \"text\": \"SUCCESS\"\n" +
                "      }\n" +
                "    ]\n" +
                "  }\n" +
                "}";
    
        ObjectMapper objectMapper = new ObjectMapper();
        JsonNode jsonNode = objectMapper.readTree(json);
        List<String> keyList = new ArrayList<>();
        System.out.println(getKeys(jsonNode, keyList));
    }
    [metadata, msgLst, code, text]