2014-10-18 6 views
0

У меня есть приличный опыт работы с REST и JSON, но я не могу придумать способ прочитать JSON как объект Java.Как читать этот JSON как объект? Gson

Ответ здесь: https://api.kraken.com/0/public/OHLC?pair=XBTCZEUR&interval=60

Обратите внимание, как один из имен (соответствующие данные) зависит от параметра запроса. Я не уверен, как создать объект Java для использования Gson для десериализации, поскольку одно из имен переменных может измениться.

Я думал, что, возможно, использование JsonReader для чтения ответа потоковым способом может работать, но когда я это сделаю, я получаю сообщение об ошибке 403.

Любые идеи?

+0

вы можете следовать ПОДХОД, чтобы прочитать его в формате бина, так что компонент содержит все элементы (это могут быть найдены или не может быть кладезем в формате JSON) также вы json имеет много параметров, поэтому его bette r вы используете bean 'http: //www.jsoneditoronline.org/? id = 13e7c95e8439b49c20412204ecaa1c8e' – Divya

ответ

0

Если у вас нет точного знания о том, что ответ будет содержать, вы всегда можете использовать реализацию класса карты, чтобы перейти к gson, как я пытался показать здесь:

public class RestResponse { 

    private boolean success; 
    private String errorDescription; 
    private Map<String, Object> data; 

    private static Gson GSON = new Gson(); 

    private RestResponse() 
    { 
     data = new HashMap<String, Object>(); 
    } 

    public boolean isSuccess() { 
     return success; 
    } 

    private void setSuccess(boolean success) { 
     this.success = success; 
    } 

    public String getErrorDescription() { 
     return errorDescription; 
    } 

    private void setErrorDescription(String errorDescription) { 
     this.errorDescription = errorDescription; 
    } 

    public Object getData(String... nestedKeys) 
    { 
     List<String> nestedKeysAsList = Arrays.asList(nestedKeys); 
     return getData(nestedKeysAsList); 
    } 

    public Object getData(List<String> nestedKeys) 
    { 
     String firstKey = nestedKeys.get(0); 
     if(!data.containsKey(firstKey)) 
      throw new IllegalArgumentException("Key not found"); 

     Object mapValue = data.get(firstKey); 

     if(!(mapValue instanceof Map)) 
      return mapValue; 

     String finalKey = nestedKeys.get(nestedKeys.size()-1); 
     if(nestedKeys.size() > 2) 
     { 
      for(String nextKey : nestedKeys.subList(1,nestedKeys.size()-1)) 
      { 
       Map<String,Object> tempMap = (Map)mapValue; 
       mapValue = tempMap.get(nextKey); 
      } 
     } 

     Map<String,Object> tempMap = (Map)mapValue; 
     return tempMap.get(finalKey); 
    } 

    private Map<String, Object> getData() { 
     return data; 
    } 

    private void setData(Map<String, Object> map){ 
     this.data = map; 
    } 

    public static RestResponse createUnsuccessfulResponse(Exception e) 
    { 
     return createUnsuccessfulResponse(e.getMessage()); 
    } 

    public static RestResponse createUnsuccessfulResponse(String reason) 
    { 
     RestResponse res = new RestResponse(); 
     res.setSuccess(false); 
     res.setErrorDescription(reason); 

     return res; 
    } 

    public static RestResponse createSuccessfulResponse(String jsonString) 
    { 
     Map<String, Object> jsonToDataMap = GSON.fromJson(jsonString, Map.class); 
     return createSuccessfulResponseByMap(jsonToDataMap); 
    } 

    private static RestResponse createSuccessfulResponseByMap(Map<String, Object> jsonToDataMap) 
    { 
     RestResponse res = new RestResponse(); 
     res.setSuccess(true); 
     res.setErrorDescription("Success"); 
     res.setData(jsonToDataMap); 

     return res; 
    } 
} 

примеры использования можно найти здесь:

https://github.com/cgunduz/btcenter/blob/master/src/main/java/com/cemgunduz/utils/entity/RestResponse.java

Смежные вопросы