2015-01-04 3 views
0

My Json выглядит что-то вроде (и его неизменяемым)Deserialize Вложенный массив объекта JSon возвращает нуль

{ 
    .... 
    "Sale": [ 
     { "SaleLines": { 
        "SaleLine": [ 
         { 
          "unitPrice": "190", 
          "unitQuantity": "1" 
         } 
       ], 
      "calcDiscount": "0", 
      "calcSubtotal": "500" 
     } 
    } ] 
} 

код Java POJO выглядит

public static class SaleLines { 

    @JsonProperty("SaleLine") 
    private ArrayList<SaleLine> saleLine; 

    public ArrayList<SaleLine> getSaleLine() { return saleLine; } 

    public void setSaleLine(ArrayList<SaleLine> saleLine) { this.saleLine = saleLine; } 
} 

public static class SaleLine { 
    @JsonProperty("itemID") 
    private String itemId;     //line_item_nk 
    @JsonProperty("unitPrice") 
    private String unitPrice; 
    .... 
} 

@JsonPropertyOrder({"total", "calcSubTotal", "calcDiscount"}) 
public static class Sale { 

    private String saleTotal, calcSubtotal, calcDiscount; 
    private int salesValueWOVat; 

    @JsonProperty("SaleLines") 
    SaleLines saleLine; 

    @JsonCreator 
    public Sale (@JsonProperty("total")String saleTotal, 
      @JsonProperty("calcSubtotal")String calcSubtotal, 
      @JsonProperty("calcDiscount")String calcDiscount, 
      @JsonProperty("SaleLines")SaleLines saleLine, 
    ) { 
     this.saleTotal = saleTotal; 
     this.calcSubtotal = calcSubtotal; 
     this.calcDiscount = calcDiscount; 
     this.saleLine = saleLine; 
     setSalesValueWOVat(); 
    } 

    // getter and setters 

} 

@SuppressWarnings({ "rawtypes" }) 
public static <E, T extends Collection> T readFromJsonAndFillType (
     String json, 
     Modules module, 
     Class <T> collectionType, 
     Class <E> elementType) 
     throws JsonParseException, JsonMappingException, IOException { 

    ObjectMapper objMapper = new ObjectMapper() 
     .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) 
     .configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true); 

    TypeFactory tf = objMapper.getTypeFactory(); 
    JsonNode node = objMapper.readTree(json).get(module.jsonFieldName); 
    return objMapper.readValue(node.toString(), 
      tf.constructCollectionType(collectionType, elementType)); 

} 

В главном

ArrayList<Sale> saleList = readFromJsonAndFillType(
       saleJSON, 
       Modules.SALE, 
       ArrayList.class, 
       Sale.class); 

for (Sale sale: saleList) { 
    System.out.println(sale.getSaleLines().getSaleLine().size()); //ERROR Null Pointer Exception 
    System.out.println(sale.toString()); 
} 

Таким образом, проблема заключается в том, что SaleLine не заселяется, как ожидалось

+0

Это не похоже на действительный JSON. 'sale' - массив, но то, что внутри массива должно быть объектом, и этот объект не окружен' {} '. – RealSkeptic

+0

упс, моя ошибка. массив продаж имеет {}, и я исправил вопрос – LivingThing

+0

. Вы знаете, если вы просто разбираетесь в Картах и ​​списках, а не POJO, вы бы уже сделали. –

ответ

1

Возможно, ваш JSON недействителен; например в вашей версии отсутствуют последние запятые в последней версии.

Если проблема в том, что ваш JSON синтаксически недействителен, вам придется либо взломать JSON, прежде чем разбирать его, либо взломать парсер, чтобы принять недействительный JSON.

С другой стороны, вполне возможно, что некоторые из ваших записей в формате JSON пропускают SaleLine или SaleLines атрибутов или имеют null вместо одного из значений. Если это возможно, добавьте несколько нулевых тестов ... и отклоните запись или справитесь с отсутствующими данными.

+1

Очень просто взять строку JSON и вставить ее в онлайн-парсер, например http://json.parser.online.fr/ для проверки синтаксиса. –

+0

@ Stephen C Предоставленный мне json не является недействительным, это была моя ошибка, копируя его для вопроса. Я исправил это сейчас. Json, предоставленный мной выше, - это идея того, что у меня есть. Проблема в том, что я упомянул в вопросе или заголовке – LivingThing

+0

@LivingThing - вы проверили, что массив не 'null' в исходном JSON? –

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