Java JSON/GSON解析为某些属性返回空值
我一直在尝试使用GSON解析一个JSON文件来显示内容。对于shipJava JSON/GSON解析为某些属性返回空值,java,json,gson,Java,Json,Gson,我一直在尝试使用GSON解析一个JSON文件来显示内容。对于shipname等属性,我得到了适当的结果,但对于其他许多属性,如typeOfShipCargo、AISversion等,我不断得到null值 我已经给出了下面的大部分代码。请让我知道是否需要添加任何其他内容。干杯 JSON文件 [ { "idmessage": "27301", "idsession": "362", "time_stamp_system": "2017-01-20 14:51:14",
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());
}
}
公共类ShipController{
私有静态ArrayList shipDet=新ArrayList();
公共静态void main(字符串[]args)引发IOException{
File inStream=新文件(“details.json”);
扫描仪读取=新扫描仪(流内);
BufferedReader bf=新的BufferedReader(新的文件阅读器(“positions.json”);
字符串json=“”;
while(read.hasNext())
{
json+=read.nextLine();
}
Gson Gson=新的Gson();
ShipDetails[]tempShip=gson.fromJson(json,ShipDetails[].class);
if(tempShip==null)
System.out.println(“空”);
shipDet.addAll(Arrays.asList(tempShip));
shipPos.addAll(Arrays.asList(tempDetails));
read.close();
//打印属性值。对于AIS版本,它返回null,而对于name,它不返回null。
用于(装运详情d:shipDet)
{
System.out.println(d.getAISversion());
}
}
这些字段的名称与Java类中的字段名称(或其对应的getter和setter)不匹配。您可以使用注释为字段使用非默认名称:
@SerializedName("type_of_ship_and_cargo")
//@SerializedName(alternate = "type_of_ship_and_cargo")
private String typeOfShipCargo;
有时,
alternate
注释的一部分足以使反序列化变得灵活,但使用默认的序列化命名。该死的,我一直在绞尽脑汁想找出我的代码有什么问题。非常感谢!