Java JSON с GSON

Вот проблема, я использую погодный APi от Wunderground и у меня проблемы с использованием GSON для получения погоды.

import java.net.*;
import java.io.*;
import com.google.gson.*;

public class URLReader {

    public static URL link;

    public static void main(String[] args) {
        try{
            open();
            read();
        }catch(IOException e){}
    }

    public static void open(){
        try{
            link = new URL("http://api.wunderground.com/api/54f05b23fd8fd4b0/geolookup/conditions/forecast/q/US/CO/Denver.json");
        }catch(MalformedURLException e){}
    }

    public static void read() throws IOException{
        Gson gson = new Gson();

        // Code to get variables like humidity, chance of rain, ect...
    }
} 

Это насколько я понял, так что, может, кто-нибудь, пожалуйста, помогите мне заставить эту вещь работать. Мне нужно иметь возможность анализировать конкретные переменные, а не только весь файл JSON.

Я использовал буферизованный ридер, но он прочитал весь файл JSON.

Заранее спасибо, я новичок, так что будьте проще и объясните все очень просто:)

3 ответа

Решение

Вы можете проанализировать весь поток, а затем извлечь то, что вам нужно. Вот пример анализа этого:

    String url=getUrl();
    JSONObject jsonObject = new JSONObject();
    StringBuilder stringBuilder=new StringBuilder();
    try 
    {
        HttpGet httpGet = new HttpGet(url);
        HttpClient client = new DefaultHttpClient();
        HttpResponse response = client.execute(httpGet);
        HttpEntity entity = response.getEntity();
        InputStream stream = entity.getContent();
        int b;
        while ((b = stream.read()) != -1) {
            stringBuilder.append((char) b);
        }

        jsonObject = new JSONObject(stringBuilder.toString());

    } catch (JSONException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
    } catch (IOException e) {    }

Прочитав это, вы должны пройти по таблице, примерно так:

jsonObject.getJSONObject("Results");

Вот пример одной из моих программ, использующих эту библиотеку:

int statusCode=jobj.getJSONObject("info").getInt("statuscode");

Я активно использую следующее, чтобы понять это правильно:

jsonObject.names();

Это даст вам название всех ключей. Оттуда вы должны выяснить, является ли это массив, объект или примитивный тип. Мне нужно немного, чтобы понять это правильно, но как только вы сделали это один раз, это будет сделано навсегда, надеюсь. Взгляните на документы Android в их библиотеке JSON.

GSON может анализировать дерево JSON в объект Java, экземпляр класса Java. Итак, если вы хотите использовать GSON для этого случая, вам нужно создать класс (ы) и аннотировать их соответствующими именами полей структуры JSON. GSON имеет очень обширную и легкую для чтения документацию, пожалуйста, ознакомьтесь с ней. Однако с этим довольно сложным деревом я не рекомендую отображать его в объекты Java. Если вам нужны только некоторые данные, отбросьте GSON и перемещайтесь по дереву вручную, как предложил PearsonArtPhoto.

Ты можешь использовать JsonParser, Это пример, основанный на вашем URL, который вы можете немедленно скопировать, вставить и запустить.

Я добавил служебный метод, который позволяет получить элемент из сгенерированного JsonElement дерево, используя что-то вроде пути. Ваш JSON, действительно, почти дерево объектов и значений (за исключением части прогноза).

Обратите внимание, что JsonElement может быть снова "приведен" как объект, массив или базовое значение в соответствии с вашими потребностями. Вот почему после звонка getAtPath, Я звоню getAsString метод.

package stackru.questions.q19966672;

import java.io.*;
import java.net.*;
import java.nio.charset.Charset;

import com.google.gson.*;

public class Q19966672 {

        private static String readAll(Reader rd) throws IOException {

        BufferedReader reader = new BufferedReader(rd);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line);
        }
        return sb.toString();
    }

    private static JsonElement getAtPath(JsonElement e, String path) {
        JsonElement current = e;
        String ss[] = path.split("/");
        for (int i = 0; i < ss.length; i++) {
            current = current.getAsJsonObject().get(ss[i]);
        }
        return current;
    }

    public static void main(String[] args) {
        String url = "http://api.wunderground.com/api/54f05b23fd8fd4b0/geolookup/conditions/forecast/q/US/CO/Denver.json";
        InputStream is = null;
        try {
            is = new URL(url).openStream();
            BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
            String jsonText = readAll(rd);

            JsonElement je = new JsonParser().parse(jsonText);

            System.out.println("In " + getAtPath(je, "current_observation/display_location/city").getAsString() + " is " + getAtPath(je, "current_observation/weather").getAsString());

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

        } finally {
            try {
                if (is != null)
                    is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

и вот результат:

In Denver is Mostly Cloudy
Другие вопросы по тегам