【问题标题】:JSON/GSON parsing returns null value for certain attributes [duplicate]JSON/GSON 解析为某些属性返回空值 [重复]
【发布时间】:2017-01-29 04:49:47
【问题描述】:

我一直在尝试使用 GSON 解析 JSON 文件以显示内容。对于像ship 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());
        }
}

【问题讨论】:

    标签: java json gson


    【解决方案1】:

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

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

    有时alternate 部分注解足以使反序列化灵活但使用默认命名进行序列化。

    【讨论】:

    • 该死的,我一直在努力找出我的代码出了什么问题。非常感谢!
    猜你喜欢
    • 2013-04-20
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    相关资源
    最近更新 更多