Michael Woywod
Michael Woywod

Reputation: 458

Deserialize JSON with unknown Keys

I'm trying to deserialize a JSON object (from JIRA REST API createMeta) with unknown keys.

{
"expand": "projects",
"projects": [
    {
        "self": "http://www.example.com/jira/rest/api/2/project/EX",
        "id": "10000",
        "key": "EX",
        "name": "Example Project",
        "avatarUrls": {
            "24x24": "http://www.example.com/jira/secure/projectavatar?size=small&pid=10000&avatarId=10011",
            "16x16": "http://www.example.com/jira/secure/projectavatar?size=xsmall&pid=10000&avatarId=10011",
            "32x32": "http://www.example.com/jira/secure/projectavatar?size=medium&pid=10000&avatarId=10011",
            "48x48": "http://www.example.com/jira/secure/projectavatar?pid=10000&avatarId=10011"
        },
        "issuetypes": [
            {
                "self": "http://www.example.com/jira/rest/api/2/issueType/1",
                "id": "1",
                "description": "An error in the code",
                "iconUrl": "http://www.example.com/jira/images/icons/issuetypes/bug.png",
                "name": "Bug",
                "subtask": false,
                "fields": {
                    "issuetype": {
                        "required": true,
                        "name": "Issue Type",
                        "hasDefaultValue": false,
                        "operations": [
                            "set"
                        ]
                    }
                }
            }
        ]
    }
]

}

My problem is: I don't know the keys into "fields" (in the example below "issuetype", "summary", "description", "customfield_12345").

"fields": {
    "issuetype": { ... },
    "summary": { ... },
    "description": { ... },
    "customfield_12345": { ... }
}

It would be awesome if I could deserialize it as an array with the key as "id" in my POJO so the above example will looke like the following:

class IssueType {
    ...
    public List<Field> fields;
    ...
}

class Field {
    public String id; // the key from the JSON object e.g. "issuetype"
    public boolean required;
    public String name;
    ...
}

Is there a way I can achieve this and wrap in my model? I hope my problem is somehow understandable :)

Upvotes: 1

Views: 2608

Answers (3)

Esperanz0
Esperanz0

Reputation: 1586

I know it's old question but I also had problem with this and there are results.. Meybe will help someone in future : )

My Response with unknow keys:

in Model Class
private JsonElement attributes;


"attributes": {
        "16": [],
        "24": {
          "165": "50000 H",
          "166": "900 lm",
          "167": "b.neutr.",
          "168": "SMD 3528",
          "169": "G 13",
          "170": "10 W",
          "171": "230V AC / 50Hz"
        }
      },

So I also checked if jsonElement is jsonArray its empty. If is jsonObject we have data.

  ProductModel productModel = productModels.get(position);

        TreeMap<String, String> attrsHashMap = new TreeMap<>();

        if (productModel.getAttributes().isJsonObject())
        {
         for (Map.Entry<String,JsonElement> entry : productModel.getAttributes().getAsJsonObject().entrySet())
         {
             Log.e("KEYS", "KEYS: " + entry.getKey() + " is empty: " + entry.getValue().isJsonArray());

             if (entry.getValue() != null && entry.getValue().isJsonObject())
             {
                 for (Map.Entry<String, JsonElement> entry1 : entry.getValue().getAsJsonObject().entrySet())
                 {
                     Log.e("KEYS", "KEYS INSIDE: " + entry1.getKey() + " VALUE: " + entry1.getValue().getAsString());

            // and there is my keys and values.. in your case You can get it in upper for loop..
                 }
             }
         }

Upvotes: 1

If you don't know the keys beforehand, you can't define the appropriate fields. The best you can do is use a Map<String,Object>.

If there are in fact a handful of types, for which you can identify a collection of fields, you could write a custom deserializer to inspect the fields and return an object of the appropriate type.

Upvotes: 3

Charlie Martin
Charlie Martin

Reputation: 112414

There is a perfectly adequate JSON library for Java that will convert any valid JSON into Java POJOs. http://www.json.org/java/

Upvotes: -4

Related Questions