2014-02-09 4 views
0

Я занимаюсь написанием Java API для доступа к API Cryptsy. При попытке десериализовать конкретный вызов api у меня возникает проблема с NullPointerException.NullPointer с использованием GSON, реализующего Cryptsy API

Проблема линия происходит в классе адаптера:

JsonObject orderbookObj = json.getAsJsonObject().getAsJsonObject("return");

API вызовы: http://pubapi.cryptsy.com/api.php?method=orderdata

Вывод в формате JSON:

{ 
    "success":1, 
    "return": 
    { 
    "ASC": 
    { 
     "marketid":"111", 
     "label":"ASC\/LTC", 
     "primaryname":"AsicCoin", 
     "primarycode":"ASC", 
     "secondaryname":"LiteCoin", 
     "secondarycode":"LTC", 
     "sellorders": 
     [ 
     { 
      "price":"0.00004197", 
      "quantity":"1536.00000000", 
      "total":"0.06446592" 
     },... 
     ], 
     "buyorders": 
     [ 
     { 
      "price":"0.00003957", 
      "quantity":"7147.96283059", 
      "total":"0.28284489" 
     },... 
     ] 
    }, 
    "CENT": 
    { 
     .... 

Базовый класс для всех сериализованных объектов

public class Result { 
private int success; 
private String error; 

public Result() { 
    error = ""; 
} 

// Getters and Setters 
} 

Этот класс содержит информацию о покупке/продаже по специальной цене.

public class GeneralOrder { 

private double price; 
private double quantity; 
private double total; 

public GeneralOrder(){} 

// Getters and Setters 
} 

Это класс, который будет хранить всю информацию, связанную с «ASC» или «CENT»

public class GeneralOrderbook { 

private int marketid ; 
private String label ; 
private String primarycode ; 
private String primaryname ; 
private String secondarycode ; 
private String secondaryname ; 

@SerializedName("sellorders") 
private GeneralOrder[] sellorders; 

@SerializedName("buyorders") 
private GeneralOrder[] buyorders; 

public GeneralOrderbook(){} 

    // Getters and Setters 
} 

Они рядом классов используются во время десериализации

public class GeneralMarketData{ 
private GeneralMarket[] markets; 

public GeneralMarketData(){} 

// Getters and Setters 
} 

public class GeneralOrderbookReturn extends Result{ 

@SerializedName("return") 
private GeneralOrderbookData data; 

public GeneralOrderbookReturn(){} 

// Getters and Setters 
} 

класса который обеспечивает индивидуальную десериализацию

public class GeneralOrderbookAdapter implements JsonDeserializer<GeneralOrderbookData> { 

public GeneralOrderbookData deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
    GeneralOrderbookData god = new GeneralOrderbookData(); 
    JsonObject orderbookObj = json.getAsJsonObject().getAsJsonObject("return"); 
    List<GeneralOrderbook> orderbooks = new ArrayList<GeneralOrderbook>(); 
    Iterator<Entry<String, JsonElement>> itr = orderbookObj.entrySet().iterator(); 
    while(itr.hasNext()) 
    { 
     GeneralOrderbook orderbook = context.deserialize(itr.next().getValue(), GeneralOrderbook.class); 
     orderbooks.add(orderbook); 
    } 
    god.setOrderbook(orderbooks.toArray(new GeneralOrderbook[0])); 
    return god; 
} 
} 

ответ

0

return - это поле верхнего уровня в возвращаемом объекте JSON, который, по-видимому, отображается на ваш класс Result. Учитывая это, Result класс должен выглядеть следующим образом:

public class Result { 
    private int success; 
    @SerializedName("return") 
    private MyClassThatModelsReturn data; 
    private String error; 

    public Result() { 
     error = ""; 
    } 

    // Getters and Setters 
} 

Не зная ничего о данных, которые вы пытаетесь смоделировать, являются «ASC», «CENT» и т.д. текстовые тикер-как символы или что-то? Если это так, взглянув на ваши классы, представляется, что он может быть смоделирован как:

public class Result { 
    private int success; 
    @SerializedName("return") 
    private Map<String, GeneralOrderbook> data; 
    private String error; 

    // Don't initialize error in constructor, just check for null 
    public boolean isError() { 
     return error != null; 
    } 

    // Getters and Setters 
} 
+0

Да, «ASC» и «CENT» являются символами строкового тикера. –

+0

Спасибо, я смог заставить его работать правильно с вами. –

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