Десериализация Java-массива / списка с помощью gson

#java #json #serialization #gson #deserialization

#java #json #сериализация #gson #десериализация

Вопрос:

Я использую gson в Java для десериализации некоторого JSON, поступающего из Azure EventGrid (в основном это просто обычное сообщение JSON). Я продолжаю получать исключения malmformed JSON , вызванные или просто странные ошибки, такие как unterminated object at line 1 column 13 path $[0].msg

Вот как выглядит JSON, который я пытаюсь десериализовать:

 {
  "id": "3984520-582350923-52389532042802",
  "subject": "/v1-1/URL_PATH_HERE",
  "data": [
    {
    "msg": "randomMsgHere",
    "time": 1599922804852,
    "type": "",
    "alarm": true,
    "source": "",
    "category": "",
    "severity": "",
    "elementId": "",
    "networkId": "",
    "hardwareType": "",
    "failureObject": "",
    "reportingAgent": "",
    "sourceDisplayName": "",
    "failureObjectDisplayName": "",
    "managedObjectDisplayName": "",
    "extendedAttributes": {
        "eventId": 100,
        "customerAlias": "string",
        "latitude": 10.00,
        "longitude": 10.00,
        "elevation": 10.00
    }
}
  ],
  "eventType": "eventType",
  "dataVersion": "1",
  "metadataVersion": "1",
  "eventTime": "2020-10-13T01:41:32.765Z",
  "topic": "randomTopicHere"
}
  

Я просто помещаю туда некоторые случайные данные (притворяюсь, что в пустых строках есть данные), и я вызываю метод для извлечения или получения () свойства data [ ] JSON, поэтому я должен получить массив. У меня уже есть класс данных, определенный в Java, поэтому я могу легко десериализовать его, но я обычно использую классы данных Kotlin и Object mapper от Jackson, и я думаю, что этот массив вызывает проблемы.

Какой самый простой способ просто преобразовать эту строку JSON в EventState.class определенную таким образом?

 @Getter
    @Setter
public class EventState {
    private String msg;
    private long time;
    private String type;
    private boolean alarm;
    private String source;
    private String category;
    private String severity;
    private String elementId;
    private String networkId;
    private String hardwareType;
    private String failureObject;
    private String reportingAgent;
    private String sourceDisplayName;
    private String failureObjectDisplayName;
    private String managedObjectDisplayName;
    private ExtendedAttributes extendedAttributes;

    @Getter
    @Setter
    public static class ExtendedAttributes {
        private int eventId;
        private String customerAlias;
        private Double latitude;
        private Double longitude;
        private Double elevation;
    }
  

Ответ №1:

приведенную выше строку json легко разобрать с помощью gson, просто добавьте контейнер вокруг состояния события.

Вот пример:

 public class Test {

public static void main(String[] args) {
    String value = "{n"  
            "  "id": "3984520-582350923-52389532042802",n"  
            "  "subject": "/v1-1/URL_PATH_HERE",n"  
            "  "data": [n"  
            "    {n"  
            "    "msg": "randomMsgHere",n"  
            "    "time": 1599922804852,n"  
            "    "type": "",n"  
            "    "alarm": true,n"  
            "    "source": "",n"  
            "    "category": "",n"  
            "    "severity": "",n"  
            "    "elementId": "",n"  
            "    "networkId": "",n"  
            "    "hardwareType": "",n"  
            "    "failureObject": "",n"  
            "    "reportingAgent": "",n"  
            "    "sourceDisplayName": "",n"  
            "    "failureObjectDisplayName": "",n"  
            "    "managedObjectDisplayName": "",n"  
            "    "extendedAttributes": {n"  
            "        "eventId": 100,n"  
            "        "customerAlias": "string",n"  
            "        "latitude": 10.00,n"  
            "        "longitude": 10.00,n"  
            "        "elevation": 10.00n"  
            "    }n"  
            "}n"  
            "  ],n"  
            "  "eventType": "eventType",n"  
            "  "dataVersion": "1",n"  
            "  "metadataVersion": "1",n"  
            "  "eventTime": "2020-10-13T01:41:32.765Z",n"  
            "  "topic": "randomTopicHere"n"  
            "}";
    Gson gson = new Gson();
    EventStateContainer eventStateContainer = gson.fromJson(value, EventStateContainer.class);
    System.out.println(eventStateContainer.getData());
}

public class EventStateContainer {
    private String id;
    private String subject;
    private ArrayList<EventState> data;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public ArrayList<EventState> getData() {
        return data;
    }

    public void setData(ArrayList<EventState> data) {
        this.data = data;
    }
}

public class EventState {
    private String msg;
    private long time;
    private String type;
    private boolean alarm;
    private String source;
    private String category;
    private String severity;
    private String elementId;
    private String networkId;
    private String hardwareType;
    private String failureObject;
    private String reportingAgent;
    private String sourceDisplayName;
    private String failureObjectDisplayName;
    private String managedObjectDisplayName;
    private ExtendedAttributes extendedAttributes;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public long getTime() {
        return time;
    }

    public void setTime(long time) {
        this.time = time;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public boolean isAlarm() {
        return alarm;
    }

    public void setAlarm(boolean alarm) {
        this.alarm = alarm;
    }

    public String getSource() {
        return source;
    }

    public void setSource(String source) {
        this.source = source;
    }

    public String getCategory() {
        return category;
    }

    public void setCategory(String category) {
        this.category = category;
    }

    public String getSeverity() {
        return severity;
    }

    public void setSeverity(String severity) {
        this.severity = severity;
    }

    public String getElementId() {
        return elementId;
    }

    public void setElementId(String elementId) {
        this.elementId = elementId;
    }

    public String getNetworkId() {
        return networkId;
    }

    public void setNetworkId(String networkId) {
        this.networkId = networkId;
    }

    public String getHardwareType() {
        return hardwareType;
    }

    public void setHardwareType(String hardwareType) {
        this.hardwareType = hardwareType;
    }

    public String getFailureObject() {
        return failureObject;
    }

    public void setFailureObject(String failureObject) {
        this.failureObject = failureObject;
    }

    public String getReportingAgent() {
        return reportingAgent;
    }

    public void setReportingAgent(String reportingAgent) {
        this.reportingAgent = reportingAgent;
    }

    public String getSourceDisplayName() {
        return sourceDisplayName;
    }

    public void setSourceDisplayName(String sourceDisplayName) {
        this.sourceDisplayName = sourceDisplayName;
    }

    public String getFailureObjectDisplayName() {
        return failureObjectDisplayName;
    }

    public void setFailureObjectDisplayName(String failureObjectDisplayName) {
        this.failureObjectDisplayName = failureObjectDisplayName;
    }

    public String getManagedObjectDisplayName() {
        return managedObjectDisplayName;
    }

    public void setManagedObjectDisplayName(String managedObjectDisplayName) {
        this.managedObjectDisplayName = managedObjectDisplayName;
    }

    public ExtendedAttributes getExtendedAttributes() {
        return extendedAttributes;
    }

    public void setExtendedAttributes(ExtendedAttributes extendedAttributes) {
        this.extendedAttributes = extendedAttributes;
    }

    @Override
    public String toString() {
        return "EventState{"  
                "msg='"   msg   '''  
                ", time="   time  
                ", type='"   type   '''  
                ", alarm="   alarm  
                ", source='"   source   '''  
                ", category='"   category   '''  
                ", severity='"   severity   '''  
                ", elementId='"   elementId   '''  
                ", networkId='"   networkId   '''  
                ", hardwareType='"   hardwareType   '''  
                ", failureObject='"   failureObject   '''  
                ", reportingAgent='"   reportingAgent   '''  
                ", sourceDisplayName='"   sourceDisplayName   '''  
                ", failureObjectDisplayName='"   failureObjectDisplayName   '''  
                ", managedObjectDisplayName='"   managedObjectDisplayName   '''  
                ", extendedAttributes="   extendedAttributes  
                '}';
    }
}

public static class ExtendedAttributes {
    private int eventId;
    private String customerAlias;
    private Double latitude;
    private Double longitude;
    private Double elevation;

    public int getEventId() {
        return eventId;
    }

    public void setEventId(int eventId) {
        this.eventId = eventId;
    }

    public String getCustomerAlias() {
        return customerAlias;
    }

    public void setCustomerAlias(String customerAlias) {
        this.customerAlias = customerAlias;
    }

    public Double getLatitude() {
        return latitude;
    }

    public void setLatitude(Double latitude) {
        this.latitude = latitude;
    }

    public Double getLongitude() {
        return longitude;
    }

    public void setLongitude(Double longitude) {
        this.longitude = longitude;
    }

    public Double getElevation() {
        return elevation;
    }

    public void setElevation(Double elevation) {
        this.elevation = elevation;
    }

    @Override
    public String toString() {
        return "ExtendedAttributes{"  
                "eventId="   eventId  
                ", customerAlias='"   customerAlias   '''  
                ", latitude="   latitude  
                ", longitude="   longitude  
                ", elevation="   elevation  
                '}';
    }
}
  

}

С наилучшими пожеланиями

Torben