Reputation: 59
I have a json:
{
"mainObject": "firstMainObject",
"mainObjectInfo": {
"firstInfo": "1",
"secondInfo": "2"
},
"values": [
{
"valueName": "111",
"valueList": {
"details": [
"111FirstDetails",
"111SecondDetails"
],
"valueDescription": "desc1",
"detailsInfo": "111detailsInfo"
},
"endValue": "11End"
},
{
"valueName": "222",
"valueList": {
"details": [
"222FirstDetails",
"222SecondDetails"
],
"valueDescription": "desc2",
"detailsInfo": "222detailsInfo"
},
"endValue": "22End"
},
{
"valueName": "333",
"valueList": {
"details": [
"333FirstDetails",
"333SecondDetails"
],
"valueDescription": "desc3",
"detailsInfo": "333detailsInfo"
},
"endValue": "33End"
}
],
"lastInfo": "ok"
}
I want to extract List of valueDescription
and detailsInfo
valus from valueList
.
I created a class:
public class MyObject {
@SerializedName("valueDescription")
String valueDescription;
@SerializedName("detailsInfo")
String detailsInfo;
}
and then use:
Gson gson = new Gson();
List<MyObject> myObject = gson.fromJson(myJson,new TypeToken<ArrayList<MyObject>>(){}.getType());
but something goes wrong and there is an error:
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $
at com.google.gson.Gson.fromJson(Gson.java:900)
at com.google.gson.Gson.fromJson(Gson.java:853)
at com.google.gson.Gson.fromJson(Gson.java:802)
at com.package.MyClass.myMethod(MyClass.java:95)
at com.package.MyClass.myMethod(MyClass.java:33)
at com.atlassian.stash.internal.hook.repository.DefaultRepositoryHookService.postUpdate(DefaultRepositoryHookService.java:788)
at com.atlassian.stash.internal.hook.repository.DefaultRepositoryHookService.doPostUpdate(DefaultRepositoryHookService.java:595)
at com.atlassian.stash.internal.hook.repository.DefaultRepositoryHookService.postUpdate(DefaultRepositoryHookService.java:362)
at com.atlassian.stash.internal.hook.repository.CoreRefChangeEventToRepositoryHookAdapter.onRefsChanged(CoreRefChangeEventToRepositoryHookAdapter.java:55)
at com.atlassian.event.internal.SingleParameterMethodListenerInvoker.invoke(SingleParameterMethodListenerInvoker.java:40)
at com.atlassian.stash.internal.event.AsyncBatchingInvokersTransformer$AsyncInvokerBatch.invoke(AsyncBatchingInvokersTransformer.java:109)
at com.atlassian.event.internal.AsynchronousAbleEventDispatcher$1$1.run(AsynchronousAbleEventDispatcher.java:38)
at com.atlassian.sal.core.executor.ThreadLocalDelegateRunnable.run(ThreadLocalDelegateRunnable.java:34)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at com.atlassian.stash.internal.event.EventThreadFactory.lambda$createThread$0(EventThreadFactory.java:24)
at java.lang.Thread.run(Thread.java:745)
... 31 frames trimmed
Caused by: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $
at com.google.gson.stream.JsonReader.beginArray(JsonReader.java:350)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:80)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61)
at com.google.gson.Gson.fromJson(Gson.java:888)
... 16 common frames omitted
I want a list of MyObject
object like:
1) consists valueDescription
= desc1
and detailsInfo
= 111detailsInfo
2) consists valueDescription
= desc2
and detailsInfo
= 222detailsInfo
3) consists valueDescription
= desc3
and detailsInfo
= 333detailsInfo
How is it possible to extract this values from my json?
Upvotes: 0
Views: 137
Reputation: 22474
You're trying to parse a JSON Object as a JSON Array.
What you're looking for is something like this:
Used to parse the entire object:
public class WrapperObject {
@SerializedName("values")
List<ValueObject> values;
public List<ValueObject> getValues(){
return values;
}
}
Properties wrapper:
public class ValueObject{
@SerializedName("valueList")
MyObject valueList;
public MyObject getValueList(){
return valueList;
}
}
Required information:
public class MyObject{
@SerializedName("valueDescription")
String valueDescription;
@SerializedName("detailsInfo")
String detailsInfo;
}
parsing:
WrapperObject wrapperObject = new Gson().fromJson(myJson, WrapperObject.class);
Upvotes: 1