js_248
js_248

Reputation: 2112

Convert nested JSON string to list of java object

I have this json String

{"data":"[Level [key=LevelKey [keyEnd=0], Description=abc], Level [key=levelKey [keyEnd=1], Description=xyz]", "id":"123"}

And corresponding java classes are

public class Level {
  public LevelKey key;
  public String id;
 }


 public class LevelKey{
 public String keyEnd;
 }

I want to convert this data json string to list of Level object using Jackson

 ObjectMapper mapper = new ObjectMapper();
    List<Level> arr = mapper.readValue(data, new TypeReference<List<Level>>(){});

But I am getting below error

com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'Level': was expecting ('true', 'false' or 'null')

Is there any other method to parse it?

Upvotes: 1

Views: 2434

Answers (3)

anurag0510
anurag0510

Reputation: 763

This was an interesting one I must say. Take a look at code snippet I think I got it correct :

String data ="{\"data\":\"[Level [key=LevelKey [keyEnd=0], Description=abc], Level [key=levelKey [keyEnd=1], Description=xyz]\", \"id\":\"123\"}";
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
List<Level> arr = mapper.readValue(data, (new ArrayList<Level>()).getClass());
System.out.println(arr);

I got the following output :

[{data=[Level [key=LevelKey [keyEnd=0], Description=abc], Level [key=levelKey [keyEnd=1], Description=xyz], id=123}]

Also if you encountered any JsonParseException which according to documentation means :

Exception type for parsing problems, used when non-well-formed content (content that does not conform to JSON syntax as per specification) is encountered.

So while hacking the JSON you can update the ObjectMapper object like this :

mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);

Also as mentioned by Exception_al using a direct class reference of ArrayList instead of having to instantiate TypeReference like below to parse the above (corrected) json string.

List<Level> arr = mapper.readValue(data, (new ArrayList<Level>()).getClass());

Hope this helped.

Upvotes: 1

Cristian Sevescu
Cristian Sevescu

Reputation: 1489

The String is not the JSON representation of what you expect you get deserialized into JAVA.
This is a JSON String:

"{"data":[{"key":{"keyEnd":0},"Description":"abc"},{"key":{"keyEnd":1},"Description":"abc"}],"id":"123"}"

So, there is either a problem with the String or you need to do the parsing yourself.

Upvotes: 0

Exception_al
Exception_al

Reputation: 1079

The below does not look like a proper JSON for the purpose (except for a standard fixed string)

"[Level [key=LevelKey [keyEnd=0], Description=abc], Level [key=levelKey [keyEnd=1], Description=xyz]"

You could correct the data part of your JSON to something like below (Closest to your JSON in question) :

[\"Level [key=LevelKey [keyEnd=0], Description=abc]\",\" Level [key=levelKey [keyEnd=1], Description=xyz]\"]

Is there any other method to parse it?

You could use a direct class reference of ArrayList instead of having to instantiate TypeReference like below to parse the above (corrected) json string :

List<Level> arr = mapper.readValue(data, (new ArrayList<Level>()).getClass());

Upvotes: 1

Related Questions