반응형
Gson 라이브러리를 통해서 Json String을 VO로 파싱하는 도중 아래와 같은 에러가 발생하였다.
java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 4 column 10 path $.items
at com.google.gson.stream.JsonReader.beginArray(JsonReader.java:351) ~[gson-2.8.6.jar:na]
at com.google.gson.internal.bind.ArrayTypeAdapter.read(ArrayTypeAdapter.java:70) ~[gson-2.8.6.jar:na]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:131) ~[gson-2.8.6.jar:na]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:222) ~[gson-2.8.6.jar:na]
at com.google.gson.Gson.fromJson(Gson.java:932) ~[gson-2.8.6.jar:na]
at com.google.gson.Gson.fromJson(Gson.java:897) ~[gson-2.8.6.jar:na]
at com.google.gson.Gson.fromJson(Gson.java:846) ~[gson-2.8.6.jar:na]
at com.google.gson.Gson.fromJson(Gson.java:817) ~[gson-2.8.6.jar:na]
at com.study.jaewonstudy.webservice.web.json.controller.JsonRestcontroller.getJson(JsonRestcontroller.java:79) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_201]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_201]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_201]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_201]
1. 에러 발생 상황
API를 통해 Json 형태로 데이터를 주고 받으면서, 데이터 파싱 도중 발생.
- 실패 Json
{
"header": "Json Parsing",
"items": {
"id": "Json"
}
}
- 파싱 VO
@Getter
@Setter
@ToString
public class GetJsonModel {
private String header;
private GetJsonItemsModel[] items;
}
1-1. 원인
VO는 List(리스트)로 받아야하는 파라미터가 있었지만, 파싱하고자 하는 Json String 에서는 List 형태가 아니기 때문에 발생.
2. 에러 발생시 해결법
받고자 하는 Json의 데이터 구조를 수정해야한다.(List 형식으로 전달)
- 정상 Json
{
"header": "Json Parsing",
"items": [
{
"id": "Json"
},
{
"id": "Parsing"
}
]
}
만약, Json의 데이터가 List 형식이 아니라면 VO를 List가 아닌 다른 타입(String etc..)의 형태로 수정한다.
반응형