Ошибка разбора файла Json на объект java с использованием парсера gson - PullRequest
0 голосов
/ 14 мая 2018

Я пытаюсь разобрать массив объектов json, используя библиотеку gson, и не могу разобрать его из-за синтаксического исключения json.Я передаю json filepath в качестве аргумента методу jsonparser.

Вот пример кода ниже, что у меня проблемы с синтаксическим анализом.

test.json - состоит из массива объектов

{
"EventRecords": [      
        {
            "eventVersion": "2.0",
            "eventSource": "aws:s3",
            "awsRegion": "us-east-1",
            "eventTime": "2018-05-10T17:10:01.420Z",
            "eventName": "ObjectCreated:Put"
        }
    ]
}

GsonParser.java:

public class GsonParser {

    public void jsonEncoder(String filePath)
    {
        Gson gson = new Gson();
        Type listType = new TypeToken<List<Record>>(){}.getType();
BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));
        List<Record> records = gson.fromJson(bufferedReader, listType);

        System.out.println("\n\nEventRecords\n\n" + records.toString());

    }
    public static void main(String[] args) throws IOException {

            GsonParser obj= new GsonParser();
            File f = new File("/Users/test/Desktop/test.json");
            obj.jsonEncoder(f.getAbsolutePath());


        }
    }

Record.java:

public class Record {

String eventVersion;
String eventSource;
String awsRegion;
String eventTime;
String eventName;

public String getEventVersion() {
    return eventVersion;
}
public void setEventVersion(String eventVersion) {
    this.eventVersion = eventVersion;
}
public String getEventSource() {
    return eventSource;
}
public void setEventSource(String eventSource) {
    this.eventSource = eventSource;
}
public String getAwsRegion() {
    return awsRegion;
}
public void setAwsRegion(String awsRegion) {
    this.awsRegion = awsRegion;
}
public String getEventTime() {
    return eventTime;
}
public void setEventTime(String eventTime) {
    this.eventTime = eventTime;
}
public String getEventName() {
    return eventName;
}
public void setEventName(String eventName) {
    this.eventName = eventName;
}
@Override
public String toString () {
  return ToStringBuilder.reflectionToString(this,ToStringStyle.MULTI_LINE_STYLE);
}
}

Ошибка:

Exception in thread "main" com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

1 Ответ

0 голосов
/ 14 мая 2018

В вашем JSON есть объект, а EventRecord - это массив внутри этого объекта.

Добавить класс скажем EventRecords

public class EventRecords{

 private List<Record> eventRecords = new ArrayList<Record>();

public List<Record> getEventRecords() {
    return this.eventRecords;
}
public void setEventRecords(List<Record> records) {
    this.eventRecords= records;
}

}

И измените свой код десериализации на

    EventRecords eventRecords = gson.fromJson(bufferedReader, listType);

И для получения изменения ArrayList

  List<Record> records = eventRecords.getEventRecords();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...