JSON / GSON解析为某些属性返回null值

时间:2017-01-29 04:49:47

标签: java json gson

我一直在尝试使用GSON解析JSON文件来显示内容。对于像name这样的属性,我获得了相应的结果,但对于typeOfShipCargoAISversion等许多其他广告,我仍然获得了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
}

儿童班

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
}

系统类

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());
        }
}

1 个答案:

答案 0 :(得分:3)

这些字段的名称与Java类(或其相应的getter和setter)中的字段名称不匹配。您可以使用SerializedName注释为字段使用非默认名称:

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

有时注释的alternate部分仅足以使反序列化变得灵活,但使用默认命名进行序列化。

相关问题