3

I am trying to parse json data with Google's gson library. But the json data doesn't behave well.

It does look like this when everything is alright:

{
    "parent": {
        "child_one": "some String",
        "child_two": "4711",
        ...
    }
}

child_one should be parsed as String, child_two as int. But sometimes one of the children has no values what results in an empty object instead of null, like this:

{
    "parent": {
        "child_one": "some String",
        "child_two": {},
        ...
    }
}

I have no access to alter the json feed, so I have to deal with it during deserialization. But I am lost here. If I just let it parse the 2nd case gives me a JsonSyntaxException.

I thought about using a custom JsonDeserializer. Do there something like inspect every element if it is a JsonObject and if it is, check if the entrySet.isEmpty(). If yes, remove that element. But I have no idea how to accomplish the iterating...

2 Answers 2

5

Can't you just replace {} with NULL before passing it to the GSON?

Sign up to request clarification or add additional context in comments.

5 Comments

null would still be invalid as OP has to parse to int.
@Adassko That was the right idea. I simply had to do this to the data, before passing it: json.toString().replace("{}", "null");
@SotiriosDelimanolis null is fine, as gson handles the parsing. :)
Key can also be an object or an array. So it is not useful to run replace().
How this seriously could be the accepted answer is beyond me. Instead of writing code that successfully parses JSON containing empty objects - which is perfectly valid - you're suggesting manually avoiding it by string substitution before parsing?
1

Make your TypeAdapter<String>'s read method like this:

public String read(JsonReader reader) throws IOException {
    boolean nextNull = false;
    while (reader.peek() == JsonToken.BEGIN_ARRAY || reader.peek() == JsonToken.END_ARRAY) {
        reader.skipValue();
        nextNull = true;
    }
    return nextNull ? null : reader.nextString();
}

Explain: when next token is [ or ], just skip it and return null.

If you replace all [] to null use String#replaceAll directly, some real string may be replaced as well, This may cause some other bugs.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.