#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