Parse Json to Java Object

I have very little experience with Json and I have to parse complex Json to Java objects.

I have tried several approaches with no success ... I am getting the weather forecast for my city in Json format and I need to parse the 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 don't know how I can parse this into objects.

Thanks a lot for the advice!

Here is my first test.

        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 exit in 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 do I get 06:00, 11:00, 17:00 and 23:00 (generic because the times can be changed) because that's the information I need?

Thanks a lot and BR Typhon

+3


source to share


5 answers


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 JSONElements checks like isJSONArray(),isJSONObject(),isJSONPrimitive()

etc and re-parse accordingly using the same strategy.

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

+3


source


I personally recommend using jackson. With jackson you can translate JSON strings to POJOs (java beans). https://github.com/FasterXML/jackson

This library is free, fast and easy to use.



Since you have dates and times as property names, I think that at least this part of your object should be a JAVA map as Amainat suggested.

+2


source


In addition to gba Jackson, you can use Google GSON: https://code.google.com/p/google-gson/

Also see this thread: Jackson Vs. Gson

+1


source


You can use the Gson library from google. Here's an example of a json object converted to a Java Map object:

 Gson gson=new Gson(); 
String json="{\"k1\":\"v1\",\"k2\":\"v2\"}";
Map<String,String> map=new HashMap<String,String>();
map=(Map<String,String>) gson.fromJson(json, map.getClass());

      

Another solution that can be tried using the Gson library is this:

Gson gson = new Gson();
String json="{\"k1\":\"v1\",\"k2\":\"v2\"}";
LinkedTreeMap result = gson.fromJson(json, LinkedTreeMap.class);

      

You need to import these two classes:

import com.google.gson.Gson;
import com.google.gson.internal.LinkedTreeMap;

      

You can check this post on the same question: How to convert JSON to HashMap using Gson?

+1


source


this is the first working code .. (quick 'n dirty).

thanks to Sumeet Sharma! Maybe someone has a better solution ...

    public void updateWeather() {
    forecasts = new ArrayList<>();
    try  {

        URL url = new URL(createURL());
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setDoOutput(true);

        OutputStream os = conn.getOutputStream();
        os.flush();

        if (conn.getResponseCode() != 200) {
            throw new RuntimeException("Failed : HTTP error code : "
                    + conn.getResponseCode());
        }

        BufferedReader br = new BufferedReader(new InputStreamReader(
                (conn.getInputStream())));

        Gson gson = new Gson();
        JsonObject jsonObj = gson.fromJson(br, JsonObject.class);

        JsonElement element = jsonObj.get("city");
        jsonObj = gson.fromJson(element.getAsJsonObject(), JsonObject.class);
        element = jsonObj.get("forecast");

        for (Map.Entry<String, JsonElement> entr : element.getAsJsonObject().entrySet()) {
            JsonElement element1 = entr.getValue().getAsJsonObject();
            for (Map.Entry<String, JsonElement> entr1 : element1.getAsJsonObject().entrySet()) {
                if (entr1.getValue().isJsonObject()) {
                    JsonElement element2 = entr1.getValue().getAsJsonObject();
                    Forecast forecast = new Forecast();
                    for (Map.Entry<String, JsonElement> entr2 : element2.getAsJsonObject().entrySet()) {
                        switch (entr2.getKey()) {
                            case "w":
                                forecast.setW(entr2.getValue().getAsString());
                                break;
                            case "tx":
                                forecast.setTx(entr2.getValue().getAsString());
                                break;
                            case "pc":
                                forecast.setPc(entr2.getValue().getAsString());
                                break;
                            case "tn":
                                forecast.setTn(entr2.getValue().getAsString());
                                break;
                            case "p":
                                forecast.setP(entr2.getValue().getAsString());
                                break;
                            case "dhl":
                                forecast.setDhl(entr2.getValue().getAsString());
                                break;
                            case "ws":
                                forecast.setWs(entr2.getValue().getAsString());
                                break;
                            case "w_txt":
                                forecast.setW_txt(entr2.getValue().getAsString());
                                break;
                        }
                    }
                    forecasts.add(forecast);
                }
            }
        }
        conn.disconnect();

    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    for(Forecast f : forecasts)
        System.out.println(f);
}

      

0


source







All Articles