当前位置: 首页 > 面试题库 >

Gson反序列化生成NULL值

危斯伯
2023-03-14
问题内容

我试图读取JSON文件并将其转换为数组,但是在读取JSON文件后从数组获取空值。我正在为我的ShipDetail班级使用默认构造函数。

  BufferedReader detailReader = new BufferedReader( new  FileReader(shipDetails));
  // Buffered passed to convert json array to java array
  ShipDetail[] shipDetail  = gson.fromJson(detailReader, ShipDetail[].class );

  System.out.println( shipDetail[0].toString());

  // Convert  array to arrayList
  ArrayList<ShipDetail> detailArray = new ArrayList<ShipDetail>(Arrays.asList(shipDetail));

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":null,
      "destination":"",
      "last_static_draught":"0",
      "DTE":"127"
   }
]

ShipDetail类:

public class ShipDetail {

    private String IdMessage, IdSession, Time_Stamp_System, Nmea_String, Processed;
    private String Mmsi, Ais_Version, Imo_Number, Callsign, Name, Type_Of_Ship_And_Cargo;
    private String Bow_To_Position_Unit, Stern_To_Position_Unit, Port_To_Position_Unit, Starboard_To_Position_Unit,
            Type_Of_Position_Fixing_Device;
    private String Eta, Destination, Last_Ship_Draught, Dte;

    public String getMmsi() {
        return Mmsi;
    }

    public String toString() {
        return "\n Id Message : " + IdMessage + "\n Id Session : " + IdSession + "\n Time Stam System : "
                + Time_Stamp_System + "\n NMEA String : " + Nmea_String + "\n Processed : " + Processed + "\n MMSI : "
                + Mmsi + "\n AIS Version : " + Ais_Version + "\n IMO Number : " + Imo_Number + "\n Call Sign : "
                + Callsign + "\n Name : " + Name + "\n Type Of Ship And Cargo : " + Type_Of_Ship_And_Cargo
                + "\n Bow To Position Unit : " + Bow_To_Position_Unit + "\n Stern To Position Unit : "
                + Stern_To_Position_Unit + "\n Port To Position Unit : " + Port_To_Position_Unit
                + "\n Starboard To Position Fixing Device : " + Starboard_To_Position_Unit
                + "\n Type Of Position Fixing Device : " + Type_Of_Position_Fixing_Device + "\n ETA : " + Eta
                + "\n Destination : " + Destination + "\n Last Ship Draught : " + Last_Ship_Draught + "\n DTE : " + Dte;
    }
}

问题答案:

您的Gson映射与给定的JSON不匹配。默认情况下,Gson通过 确切 名称将JSON属性映射到目标映射中的相应字段。看一眼:

"idmessage":"27301"

private String IdMessage

属性名称大小写和字段名称大小写不匹配。您需要的是正确映射JSON。要么:

private String idmessage

或通过覆盖名称匹配(这更适合Java命名约定):

@SerializedName("idmessage")
private String idMessage;

注意每行一个字段。为了分别注释每个字段,这是必需的。或者,如果可能,在Java和JSON中同时使用camelCase。



 类似资料:
  • 首先,我想说这是一个大学项目。 我有三节课<代码>订单抽象类和从订单继承的和类。 我使用Gson序列化/反序列化子类,但我遇到了一点问题。订单类有一个字段,gson使用该字段来确定订单类型,DineIn或Delivery。 序列化工作得很好。问题是,每当我尝试反序列化时,类型字段值都不会读取,并且总是设置为null,即使它存在于JSON文件中。当有很多字段时,就会发生这种情况,因为当我尝试在较小的

  • 我想在Java中反序列化包含空值的json字符串。我想将对象反序列化为对象。json字符串类似于: 当我反序列化使用 由于对象中的that,我得到一个空指针异常。我如何指示Gson忽略空值的反序列化?

  • 我想使用Gson将JSON反序列化为对象。我已经定义了相应的类,其中一些类的对象包含在其他对象中。在尝试反序列化整个JSON时,我得到了空值,所以我开始将其拆分。 我已经到了所有低级类都支持自己的地步,但是当我试图反序列化成一个包含那个较小对象的实例的对象时,所有的东西都返回为null。 我的部分JSON: UserProfile类: UPfield类: 用户类: Ufield类: 我的主要观点是

  • 问题内容: 我想通过Google Gson传输列表对象,但是我不知道如何反序列化泛型类型。 看了这个之后我尝试了什么(BalusC的答案): 但是后来我在日食中遇到了一个错误,说“新的List(){}类型必须实现继承的抽象方法…”,如果我使用快速修复方法,则会得到20个以上的方法存根的怪物。 我很确定有一个更简单的解决方案,但是我似乎找不到它! 编辑: 我现在有 但是,我确实在“ fromJson

  • 问题内容: 由于要执行处理的业务逻辑,因此我正在实现自定义。但是某些部分可以解析为标准方式。这是否可能- 我自己处理一些元素,并让一些嵌套元素自动处理? 这是JSON: 这是项的自定义反序列化器: 现在,我想让GSON解析枚举。我可以自己完成,这只是几行代码,但是我更愿意库做很多。 问题答案: …但是我希望图书馆尽其所能。 好吧,只需使用Gson。 有数据传输对象模式,尤其是Gson映射类,可以完

  • 我有以下JSON示例: 我想使用GSON来反序列化这个JSON字符串,并只获取“famousId”成员的值。 我已经看过了其他答案,似乎我绝对需要为此创建类。 有没有可能不映射POJO,使用JsonParser,JsonElement,JsonArray等反序列化?我已经尝试了几种排列,但没有成功。 我也尝试过以下代码,但也没有按预期工作: 不幸的是,这也不起作用,所以我想一个两部分的问题。。。可