2017-04-08 1 views
0

저는 Jackson을 사용하여 응답 값 내에 이름과 sizeFromStorage를 추출하는 Rest 서비스를 작성했습니다. JSON에 중첩 된 배열에서 값을 읽으려고합니다.

내가이 할 수있는 시도에 아래의 클래스를 생성 :이에서 얻을 출력을

import java.util.List; 

import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 

@JsonIgnoreProperties(value = {"status", "header"}) 
public class Vaults { 

private List<Object> response; 

public Vaults(){ 

} 

public Vaults(List<Object> response){ 
    this.response = response; 
} 

public List<Object> getResponse(){ 
    return response; 
} 

public void setResponse(List<Object> response) { 
    this.response = response; 
} 

@Override 
public String toString() { 
    return "" + response; 
} 
} 


import java.io.IOException; 
import java.util.List; 
import java.util.ArrayList; 

import com.fasterxml.jackson.databind.DeserializationFeature; 
import com.fasterxml.jackson.databind.ObjectMapper; 
import com.fasterxml.jackson.databind.type.CollectionType; 
import java.io.InputStream; 

public class JacksonObjectModelTest { 

public static void main(String[] args) throws IOException { 
    String jsonFileName = "/JsonRead/json.json"; 
    List<Vaults> emps = new JacksonObjectModelTest().getVaultList(jsonFileName); 
    System.out.println(emps.toString()); 
} 

public ArrayList<Vaults> getVaultList(String jsonFileName) throws IOException { 
    //read json file data to String 
    InputStream inputStream = getClass().getResourceAsStream(jsonFileName); 

    //create ObjectMapper instance 
    ObjectMapper objectMapper = new ObjectMapper().enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY); 

    //convert json string to object 
    CollectionType collectionType = objectMapper.getTypeFactory().constructCollectionType(List.class, Vaults.class); 
    ArrayList<Vaults> emps = objectMapper.readValue(inputStream, collectionType); 
    return (ArrayList<Vaults>) emps; 
} 
} 

{ 
    "status": "ok", 
    "header": { 
    "now": 1491545894581, 
    "status": "ok", 
    "requestId": "WOcvJsCoAmoAAESbkBYAAAB5" 
    }, 
    "response": { 
    "vault": [ 
     { 
    "id": 20, 
    "name": "Apple", 
    "description": "", 
    "sizeFromStorage": 95957225298, 
    "storagePools": [ 
     { 
     "storagePool": { 
      "id": 1, 
      "name": "storage-pool1", 
      "sizeFromStorage": 95957225298, 
      "generations": [ 
      { 
       "generation": { 
       "sequence": 0 
       } 
      } 
      ] 
     } 
     } 
    ] 
    }, 
    { 
    "id": 21, 
    "name": "Banana", 
    "description": "", 
    "sizeFromStorage": 98957268244, 
    "storagePools": [ 
     { 
     "storagePool": { 
      "id": 2, 
      "name": "storage-pool1", 
      "sizeFromStorage": 98957268244, 
      "generations": [ 
      { 
       "generation": { 
       "sequence": 0 
       } 
      } 
      ] 
     } 
     } 
    ] 
    }, 
] 
    } 
} 

입니다 :

[[{vaults=[{id=20, name=Apple, description=, sizeFromStorage=95957225298, storagePools=[{storagePool={id=1, name=storage-pool1, sizeFromStorage=5043, estimateUsableTotalLogicalSizeFromStorage=95957225298, generations=[{generation={sequence=0}}]}}]}, {id=20, name=Apple, description=, sizeFromStorage=95957225298, storagePools=[{storagePool={id=1, name=storage-pool1, sizeFromStorage=5043, estimateUsableTotalLogicalSizeFromStorage=95957225298, generations=[{generation={sequence=0}}]}}]}]] 

그러나, 제가하고 싶은 것은 이름과 sizeFromStorage입니다 값. 지금까지 처음 세 값을 제거했습니다. 불행히도 저는 현재 휴식 서비스 나 JSON 읽기에 익숙하지 않아 붙어 있습니다. 내가 필요로하는 것을 얻기 위해 JSON에 대해 더 깊이 파고들 수있는 방법이 있을까요? 아니면 잘못된 방식으로 접근 했나요?

추가 정보 : 내 원래의 질문을 게시 이후 나는 (내가 다른 사이트에서 본 일 기준)이 함께했다 : 그것은 내가 원하는 것을 위해 작동하지만 더 나은 방법으로이

package JsonRead; 

import java.io.File; 
import java.io.IOException; 

import com.fasterxml.jackson.databind.JsonNode; 
import com.fasterxml.jackson.databind.ObjectMapper; 

public class JacksonTreeModel { 
    public static void main(String[] args) { 

     try{ 

      ObjectMapper mapper = new ObjectMapper(); 

      JsonNode root = mapper.readTree(new File("JsonRead/json.json")); 

      JsonNode vaultsNode = root.path("response").path("vault"); 

      /*if(vaultsNode.isArray()){ 
       for(JsonNode node : vaultsNode){ 
        String name = node.path("name").asText(); 
        System.out.println("Array Name: " + name); 
       } 
      }*/ 

      for(JsonNode node : vaultsNode){ 
       String name = node.path("name").asText(); 
       String bytesUsed = node.path("sizeFromStorage").asText(); 
       System.out.println("Name: " + name + ", Bytes Used: " + bytesUsed); 
      } 

     } catch(IOException e){ 
       System.out.println("IO Exception " + e); 
     } 
    } 
} 

이 작업을 수행?

응답 해 주셔서 감사합니다. 나는 너의 제안을 살펴볼 것이다.

답변

1

좋아, 질문을 다시 읽었습니다.

응답 모음에 사용할보다 의미있는 사용자 지정 개체 유형을 사용하여 직접 VaultDAO 개체를 만드는 것이 좋습니다. 당신이 똑같은 변수 이름 (당신에게 알려진 것처럼 보임)을 사용한다면, 당신을 위해 비 직렬화해야합니다.

관련 문제