我一直在尝试使用GSON解析JSON文件来显示内容。对于像name
这样的属性,我获得了相应的结果,但对于typeOfShipCargo
,AISversion
等许多其他广告,我仍然获得了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());
}
}
答案 0 :(得分:3)
这些字段的名称与Java类(或其相应的getter和setter)中的字段名称不匹配。您可以使用SerializedName注释为字段使用非默认名称:
@SerializedName("type_of_ship_and_cargo")
//@SerializedName(alternate = "type_of_ship_and_cargo")
private String typeOfShipCargo;
有时注释的alternate
部分仅足以使反序列化变得灵活,但使用默认命名进行序列化。