0

So I've got this huge JSON file available from which I need to extract data. The JSON format goes something like this:

{
  "enabled":true,
  "contentMetadataPartial":
  {
     "customTags":
     {
        "tag1":"value1"
     }
  },
  "simulatedChanges":
  [
     3000,
     2500,
     400
  ],
  "simulatedUpdateMetadata":
  [
     {
        "customTags":
        {
           "tag1":"value1",
        },
        "assetName":"asset1234",
     },
     {
        "duration":1111,
        "encodedRate":3333,
     }
  ]
}

To read it I was trying to create a class to the map the keys and objects. Something like this, similar to this question:

public class ConfigData
{
    private Boolean enabled;
    private class ContentMetadataPartial
    {
        private class CustomTags
        {
            String tag1;
        }
    }
    int[] simulatedChanges = new int[3];

    //problem here
}

But I'm getting stuck at the array, which contains more objects not just simple basic data types.

The JSON file is huge and has similar type of items all over it. I'm fairly new with this and may be doing some mistake. Any help towards right direction is appreciated. Thanks!

John Shepard
  • 123
  • 1
  • 4

2 Answers2

0

You need a classes structure, not all in one:

ConfigData:

package com.example.gson;

import java.util.List;

public class ConfigData {

    private Boolean enabled;
    private ContentMetadataPartial contentMetadataPartial;
    private List<Integer> simulatedChanges = null;
    private List<SimulatedUpdateMetadatum> simulatedUpdateMetadata = null;

    public Boolean getEnabled() {
        return enabled;
    }

    public void setEnabled(Boolean enabled) {
        this.enabled = enabled;
    }

    public ContentMetadataPartial getContentMetadataPartial() {
        return contentMetadataPartial;
    }

    public void setContentMetadataPartial(ContentMetadataPartial contentMetadataPartial) {
        this.contentMetadataPartial = contentMetadataPartial;
    }

    public List<Integer> getSimulatedChanges() {
        return simulatedChanges;
    }

    public void setSimulatedChanges(List<Integer> simulatedChanges) {
        this.simulatedChanges = simulatedChanges;
    }

    public List<SimulatedUpdateMetadatum> getSimulatedUpdateMetadata() {
        return simulatedUpdateMetadata;
    }

    public void setSimulatedUpdateMetadata(List<SimulatedUpdateMetadatum> simulatedUpdateMetadata) {
        this.simulatedUpdateMetadata = simulatedUpdateMetadata;
    }

    @Override
    public String toString() {
        return "ConfigData [enabled=" + enabled + ", contentMetadataPartial=" + contentMetadataPartial
                + ", simulatedChanges=" + simulatedChanges + ", simulatedUpdateMetadata=" + simulatedUpdateMetadata
                + "]";
    }

}

ContentMetadataPartial:

package com.example.gson;

public class ContentMetadataPartial {

    private CustomTags customTags;

    public CustomTags getCustomTags() {
        return customTags;
    }

    public void setCustomTags(CustomTags customTags) {
        this.customTags = customTags;
    }

}

CustomTags:

package com.example.gson;

public class CustomTags {

    private String tag1;

    public String getTag1() {
        return tag1;
    }

    public void setTag1(String tag1) {
        this.tag1 = tag1;
    }

}

SimulatedUpdateMetadatum:

package com.example.gson;

public class SimulatedUpdateMetadatum {

    private CustomTags customTags;
    private String assetName;
    private Integer duration;
    private Integer encodedRate;

    public CustomTags getCustomTags() {
        return customTags;
    }

    public void setCustomTags(CustomTags customTags) {
        this.customTags = customTags;
    }

    public String getAssetName() {
        return assetName;
    }

    public void setAssetName(String assetName) {
        this.assetName = assetName;
    }

    public Integer getDuration() {
        return duration;
    }

    public void setDuration(Integer duration) {
        this.duration = duration;
    }

    public Integer getEncodedRate() {
        return encodedRate;
    }

    public void setEncodedRate(Integer encodedRate) {
        this.encodedRate = encodedRate;
    }

}

GsonMain:

package com.example.gson;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

import com.example.gson.ConfigData;
import com.google.gson.Gson;

public class GsonMain {

    private static final String jsonFile = "files/input.json";

    public static void main(String[] args) {
        String content = readFile(jsonFile);

        ConfigData conf = new Gson().fromJson(content, ConfigData.class);
        System.out.println(conf);
    }

    private static String readFile(String filename) {
        BufferedReader br = null;
        FileReader fr = null;
        StringBuilder content = new StringBuilder();

        try {
            fr = new FileReader(filename);
            br = new BufferedReader(fr);

            String sCurrentLine;
            while ((sCurrentLine = br.readLine()) != null) {
                content.append(sCurrentLine);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (br != null)
                    br.close();
                if (fr != null)
                    fr.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        return content.toString();
    }
}

And your Json well formed:

{
  "enabled":true,
  "contentMetadataPartial":
  {
     "customTags":
     {
        "tag1":"value1"
     }
  },
  "simulatedChanges":
  [
     3000,
     2500,
     400
  ],
  "simulatedUpdateMetadata":
  [
     {
        "customTags":
        {
           "tag1":"value1"
        },
        "assetName":"asset1234"
     },
     {
        "duration":1111,
        "encodedRate":3333
     }
  ]
}

I have used this web to generate the classes.

Alberto
  • 745
  • 1
  • 6
  • 25
0
  package com.webom.practice;

  import java.util.ArrayList;
  import java.util.HashMap;
  import java.util.Iterator;
  import java.util.List;
  import java.util.Map;
  import org.json.JSONArray;
   import org.json.JSONException; 
   import org.json.JSONObject;

public class Sample {

    public static Map<String, Object> jsonToMap(JSONObject json) throws JSONException {
        Map<String, Object> retMap = new HashMap<String, Object>();

        if(json != JSONObject.NULL) {
            retMap = toMap(json);
        }
        return retMap;
    }

    public static Map<String, Object> toMap(JSONObject object) throws JSONException {
        Map<String, Object> map = new HashMap<String, Object>();

        Iterator<String> keysItr = object.keys();
        while(keysItr.hasNext()) {
            String key = keysItr.next();
            Object value = object.get(key);

            if(value instanceof JSONArray) {
                value = toList((JSONArray) value);
            }

            else if(value instanceof JSONObject) {
                value = toMap((JSONObject) value);
            }
            map.put(key, value);
        }
        return map;
    }
    public static List<Object> toList(JSONArray array) throws JSONException {
        List<Object> list = new ArrayList<Object>();
        for(int i = 0; i < array.length(); i++) {
            Object value = array.get(i);
            if(value instanceof JSONArray) {
                value = toList((JSONArray) value);
            }

            else if(value instanceof JSONObject) {
                value = toMap((JSONObject) value);
            }
            list.add(value);
        }
        return list;
    }
public static void main(String[]args) {
    String Jsondata="{\r\n" + 
            "  \"enabled\":true,\r\n" + 
            "  \"contentMetadataPartial\":\r\n" + 
            "  {\r\n" + 
            "     \"customTags\":\r\n" + 
            "     {\r\n" + 
            "        \"tag1\":\"value1\"\r\n" + 
            "     }\r\n" + 
            "  },\r\n" + 
            "  \"simulatedChanges\":\r\n" + 
            "  [\r\n" + 
            "     3000,\r\n" + 
            "     2500,\r\n" + 
            "     400\r\n" + 
            "  ],\r\n" + 
            "  \"simulatedUpdateMetadata\":\r\n" + 
            "  [\r\n" + 
            "     {\r\n" + 
            "        \"customTags\":\r\n" + 
            "        {\r\n" + 
            "           \"tag1\":\"value1\",\r\n" + 
            "        },\r\n" + 
            "        \"assetName\":\"asset1234\",\r\n" + 
            "     },\r\n" + 
            "     {\r\n" + 
            "        \"duration\":1111,\r\n" + 
            "        \"encodedRate\":3333,\r\n" + 
            "     }\r\n" + 
            "  ]\r\n" + 
            "}\r\n" ;
     JSONObject json = new JSONObject(Jsondata);
     System.out.println(json);
Map<String,Object> dataConversion=Sample.jsonToMap(json);
System.out.println(dataConversion);
}
}
this_is_om_vm
  • 608
  • 5
  • 23