2017-01-29 4 views
1

Я пытаюсь разобрать файл JSON с помощью GSON для отображения содержимого. Для таких атрибутов, как ship name Я получаю соответствующие результаты, но для многих других, таких как typeOfShipCargo, AISversion и т. Д. Я продолжаю получать значения null.JSON/GSON parsing возвращает значение null для определенных атрибутов

Я дал основную часть кода, приведенного ниже. Пожалуйста, дайте мне знать, если что-то еще нужно добавить или нет. Приветствия.

JSON файла

[ 
    { 
    "idmessage": "27301", 
    "idsession": "362", 
    "time_stamp_system": "2017-01-20 14:51:14", 
    "NMEA_string": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 
    "processed": "1", 
    "MMSI": "0000000001", 
    "AIS_version": "0", 
    "IMO_number": "xxxxxxxxxx", 
    "callSign": "ODLK1", 
    "name": "ODLXJ KWW", 
    "type_of_ship_and_cargo": "0", 
    "bow_to_possition_unit": "212", 
    "stern_to_possition_unit": "71", 
    "port_to_possition_unit": "22", 
    "starboard_to_possitio_unit": "22", 
    "type_of_position_fixing_divice": "1", 
    "ETA": "Test", 
    "destination": "", 
    "last_static_draught": "0", 
    "DTE": "127" 
    } 
] 

Родитель класс

public class Ship { 
    private String idmsg; 
    private String idsession; 
    private String systemTime; 
    private String NMEAstring; 
    private String processed; 
    private String MMSI; 

    public Ship(){} 

    public Ship(String idmsg, String idsession, String systemTime, String NMEAstring, String processed, String MMSI) { 
     this.idmsg = idmsg; 
     this.idsession = idsession; 
     this.systemTime = systemTime; 
     this.NMEAstring = NMEAstring; 
     this.processed = processed; 
     this.MMSI = MMSI; 
    } 
//Getters and setters 
} 

класс Child

public class ShipDetails extends Ship { 
    private String AISversion; 
    private String IMOnumber; 
    private String callSign; 
    private String name; 
    private String typeOfShipCargo; 
    private String bowToPositionUnit; 
    private String sternToPositionUnit; 
    private String portToPositionUnit; 
    private String starboardToPositionUnit; 
    private String typeOfPositionFixingDevice; 
    private String eta; 
    private String destination; 
    private String lastStaticDraught; 
    private String dte; 

    public ShipDetails(String idmsg, String idsession, String systemTime, String NMEAstring, String processed, 
         String MMSI, String AISversion, String IMOnumber, String callSign, String name, The rest...) { 
     super(idmsg, idsession, systemTime, NMEAstring, processed, MMSI); 
     this.AISversion = AISversion; 
     this.IMOnumber = IMOnumber; 
     this.callSign = callSign; 
     this.name = name; 
     this.typeOfShipCargo = typeOfShipCargo; 
     this.bowToPositionUnit = bowToPositionUnit; 
     this.sternToPositionUnit = sternToPositionUnit; 
     this.portToPositionUnit = portToPositionUnit; 
     this.starboardToPositionUnit = starboardToPositionUnit; 
     this.typeOfPositionFixingDevice = typeOfPositionFixingDevice; 
     this.eta = eta; 
     this.destination = destination; 
     this.lastStaticDraught = lastStaticDraught; 
     this.dte = dte; 
    } 
//getters and setters 
} 

класс System

public class ShipController { 

    private static ArrayList<ShipDetails> shipDet = new ArrayList<ShipDetails>(); 

    public static void main(String[] args) throws IOException{ 
     File inStream = new File("details.json"); 

     Scanner read = new Scanner(inStream); 
     BufferedReader bf = new BufferedReader(new FileReader("positions.json")); 

     String json = ""; 
     while (read.hasNext()) 
     { 
      json += read.nextLine(); 
     } 

     Gson gson = new Gson(); 
     ShipDetails[] tempShip = gson.fromJson(json, ShipDetails[].class); 

     if(tempShip == null) 
      System.out.println("Null"); 
     shipDet.addAll(Arrays.asList(tempShip)); 
     shipPos.addAll(Arrays.asList(tempDetails)); 

     read.close(); 

//Printing the attribute values. For AIS version it retuns null while for name it doesn't. 
     for (ShipDetails d : shipDet) 
     { 
      System.out.println(d.getAISversion()); 
     } 
} 

ответ

3

Имена этих полей не соответствуют именам полей в классе Java (или их соответствующих геттерах и сеттерах). Вы можете использовать SerializedName аннотации использовать имя по умолчанию для поля:

@SerializedName("type_of_ship_and_cargo") 
//@SerializedName(alternate = "type_of_ship_and_cargo") 
private String typeOfShipCargo; 

Иногда alternate части аннотации достаточно только сделать десериализации гибкими, но использовать по умолчанию именования для сериализации.

+0

Goddamnit Я разрывал голову, пытаясь выяснить, что не так с моим кодом. Спасибо! – ZeroDarkThirty

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