Parse Json into Java Object

typhon picture typhon · Aug 24, 2014 · Viewed 9.9k times · Source

I've very less experience with Json and I've to parse a complex Json to Java Objects.

I've tried several approaches without success... I'm getting a weather forecast for my city in Json format and I need to parse that Json data into Java Objects.

The Json:

{"city":
 {"city_code":"ATAT10678",
  "name":"Wien",
  "url":"oesterreich/wien/ATAT10678.html",
  "credit":{"info":"In order to use the free weather data from wetter.com you HAVE TO display at least two out of three of the following possibilities: text, link, logo",
  "text":"Powered by wetter.com","link":"http://www.wetter.com",
  "logo":"Download at http://www.wetter.com/api/downloads/#logos"},
  "forecast":{
   "2014-08-24":{
    "w":"1",
    "tx":"20",
    "pc":"30",
    "06:00":{
     "w":"2",
     "tx":"16",
     "pc":"30",
     "tn":"15",
     "p":"5",
     "dhl":"2014-08-24 06:00",
     "ws":"19",
     "w_txt":"wolkig"},
    "11:00":{
     "w":"2",
     "tx":"18",
     "pc":"30",
     "tn":"16",
     "p":"6",
     "dhl":"2014-08-24 11:00",
     "ws":"20",
     "w_txt":"wolkig"},
    "17:00":{
     "w":"1",
     "tx":"20",
     "pc":"20",
     "tn":"16",
     "p":"6",
     "dhl":"2014-08-24 17:00",
     "ws":"12",
     "w_txt":"leicht bewölkt"},
    "23:00":{
     "w":"1",
     "tx":"16",
     "pc":"10",
     "tn":"13",
     "p":"6",
     "dhl":"2014-08-24 23:00",
     "ws":"7",
     "w_txt":"leicht bewölkt"},
    "tn":"15",
    "p":"24",
    "dhl":"2014-08-24 06:00",
    "ws":"14",
    "w_txt":"leicht bewölkt"},
   "2014-08-25":{"w":"2","tx":"22","pc":"30","06:00":{"w":"2","tx":"17","pc":"20","tn":"12","p":"5","dhl":"2014-08-25 06:00","ws":"5","w_txt":"wolkig"},"11:00":{"w":"2","tx":"21","pc":"30","tn":"17","p":"6","dhl":"2014-08-25 11:00","ws":"10","w_txt":"wolkig"},"17:00":{"w":"2","tx":"22","pc":"30","tn":"18","p":"6","dhl":"2014-08-25 17:00","ws":"11","w_txt":"wolkig"},"23:00":{"w":"3","tx":"18","pc":"30","tn":"16","p":"6","dhl":"2014-08-25 23:00","ws":"6","w_txt":"bedeckt"},"tn":"12","p":"24","dhl":"2014-08-25 06:00","ws":"8","w_txt":"wolkig"},"2014-08-26":{"w":"3","tx":"22","pc":"75","06:00":{"w":"3","tx":"17","pc":"75","tn":"15","p":"5","dhl":"2014-08-26 06:00","ws":"6","w_txt":"bedeckt"},"11:00":{"w":"61","tx":"21","pc":"75","tn":"17","p":"6","dhl":"2014-08-26 11:00","ws":"9","w_txt":"leichter Regen"},"17:00":{"w":"61","tx":"22","pc":"75","tn":"18","p":"6","dhl":"2014-08-26 17:00","ws":"9","w_txt":"leichter Regen"},"23:00":{"w":"3","tx":"18","pc":"75","tn":"17","p":"6","dhl":"2014-08-26 23:00","ws":"9","w_txt":"bedeckt"},"tn":"15","p":"24","dhl":"2014-08-26 06:00","ws":"8","w_txt":"bedeckt"}}}}

I've no idea how I can parse this to objects..

Many thanks for the advices!

Here is my first trial..

        Gson gson = new Gson();
        JsonObject jsonObj = gson.fromJson(br, JsonObject.class);
        Map<String, LinkedTreeMap> map = new HashMap<String, LinkedTreeMap>();
        map = (Map<String, LinkedTreeMap>) gson.fromJson(jsonObj.toString(), map.getClass());

        LinkedTreeMap<String, LinkedTreeMap> tmp = new LinkedTreeMap<>();
        tmp = map.get("city");

        for(Map.Entry<String, LinkedTreeMap> e : tmp.entrySet()) {
            System.out.println("k: " + e.getKey());
        }

        LinkedTreeMap<String, LinkedTreeMap> tmp1 = new LinkedTreeMap<>();
        tmp1 = tmp.get("forecast");

        for(Map.Entry<String, LinkedTreeMap> e : tmp1.entrySet()) {
            System.out.println("k: " + e.getKey());
            LinkedTreeMap<String, LinkedTreeMap> values = e.getValue();
            for(Map.Entry<String, LinkedTreeMap> v : values.entrySet()) {

                System.out.println("k: " + v.getKey() + " v: " + v.getValue());
            }

        }

and the output for one day:

k: city_code
k: name
k: url
k: credit
k: forecast
k: 2014-08-25
k: w v: 2
k: tx v: 23
k: pc v: 90
k: 06:00 v: {w=2, tx=17, pc=20, tn=13, p=5, dhl=2014-08-25 06:00, ws=5, w_txt=wolkig}
k: 11:00 v: {w=2, tx=21, pc=20, tn=17, p=6, dhl=2014-08-25 11:00, ws=9, w_txt=wolkig}
k: 17:00 v: {w=2, tx=23, pc=30, tn=17, p=6, dhl=2014-08-25 17:00, ws=11, w_txt=wolkig}
k: 23:00 v: {w=3, tx=17, pc=90, tn=16, p=6, dhl=2014-08-25 23:00, ws=6, w_txt=bedeckt}
k: tn v: 13
k: p v: 24
k: dhl v: 2014-08-25 06:00
k: ws v: 8
k: w_txt v: wolkig

so far so good but how I get the 06:00, 11:00, 17:00 and 23:00 (generic because the time can be changed) because this are the informations I need?

Thanks a lot and BR typhon

Answer

Sumeet Sharma picture Sumeet Sharma · Aug 24, 2014

Here is an example using GSON

import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
public class CodeChefTest1 {
    public static String json = "{\"balance\": 1000.21, \"num\":100, \"is_vip\":true, \"name\":\"foo\"}";
    public static void main(String[] args) {
        JsonElement ele = new JsonParser().parse(json);
        for(java.util.Map.Entry<String, JsonElement> entr : ele.getAsJsonObject().entrySet()){
            System.out.println(entr.getKey());
            System.out.println(entr.getValue());
        }
    }
}

You can use the above and run it in a loop using checks on the JSONElements like isJSONArray(),isJSONObject(),isJSONPrimitive() etc and perform suitable re-parsing using the same strategy.

The above just iterates over the json string and prints all the key value pairs. You can do the same for the date part of your json string.