type tutorial serialize from create array java arrays json arraylist gson

tutorial - json to array java



La deserialización de Gson genera valor NULL (2)

Estaba tratando de leer y convertir un archivo JSON en una matriz, pero obteniendo valores nulos de la matriz después de leer el archivo JSON. Estoy usando el constructor predeterminado para mi clase 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));

El archivo 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" } ]

La clase 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; } }


Puedes usar algo en esta línea. Tenga en cuenta que no tiene que usar Files.readAllBytes pero en su código también podría ser que el BufferedReader cause el error. Si necesita su ShipDetails como matriz en lugar de una lista, TypeToken o use el tipo que necesita en TypeToken .

final GsonBuilder builder = new GsonBuilder(); final Gson gson = builder.enableComplexMapKeySerialization().create(); // you can use the buffered reader here too, but this is easier to debug if shipDetails is a file final String jsonRepresentation = new String(Files.readAllBytes(shipDetails); // add a type definition final Type type = new TypeToken<ArrayList<ShipDetail>>(){}.getType(); ArrayList<ShipDetail> shipDetails = gson.fromJson(jsonRepresentation, type);

Y como se menciona en los comentarios anteriores, generar Getters y Setters.


Su mapeo Gson no coincide con el JSON dado. Por defecto, Gson mapea las propiedades JSON en sus campos apropiados en la asignación de destino por nombre exacto . Echa un vistazo a:

"idmessage":"27301"

y

private String IdMessage

El caso del nombre de propiedad y el caso del nombre del campo no coinciden. Lo que necesita es asignar su JSON correctamente. Ya sea:

private String idmessage

o anulando la coincidencia de nombre (y eso es más apropiado para las convenciones de nomenclatura de Java):

@SerializedName("idmessage") private String idMessage;

Tenga en cuenta un campo por línea. Esto es necesario para anotar cada campo por separado. O, si es posible, use camelCase tanto en Java como en JSON.