5 ответов:
вы можете получить необработанные данные, используя метод ниже. Кстати, этот шаблон предназначен для Java 6. Если вы используете Java 7 или выше, пожалуйста, рассмотреть try-with-resources pattern.
public String getJSON(String url, int timeout) { HttpURLConnection c = null; try { URL u = new URL(url); c = (HttpURLConnection) u.openConnection(); c.setRequestMethod("GET"); c.setRequestProperty("Content-length", "0"); c.setUseCaches(false); c.setAllowUserInteraction(false); c.setConnectTimeout(timeout); c.setReadTimeout(timeout); c.connect(); int status = c.getResponseCode(); switch (status) { case 200: case 201: BufferedReader br = new BufferedReader(new InputStreamReader(c.getInputStream())); StringBuilder sb = new StringBuilder(); String line; while ((line = br.readLine()) != null) { sb.append(line+"\n"); } br.close(); return sb.toString(); } } catch (MalformedURLException ex) { Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } finally { if (c != null) { try { c.disconnect(); } catch (Exception ex) { Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } } } return null; }и тогда вы можете использовать возвращенную строку с Google Gson чтобы отобразить JSON на объект указанного класса, например:
String data = getJSON("http://localhost/authmanager.php"); AuthMsg msg = new Gson().fromJson(data, AuthMsg.class); System.out.println(msg);есть пример класса AuthMsg:
public class AuthMsg { private int code; private String message; public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }JSON возвращается http://localhost/authmanager.php надо смотреть вот так:
{"code":1,"message":"Logged in"}в отношении
определите следующую функцию (не мою, не уверен, где я ее нашел давно):
private static String convertStreamToString(InputStream is) { BufferedReader reader = new BufferedReader(new InputStreamReader(is)); StringBuilder sb = new StringBuilder(); String line = null; try { while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } } catch (IOException e) { e.printStackTrace(); } finally { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } return sb.toString();}
затем:
String jsonReply; if(conn.getResponseCode()==201 || conn.getResponseCode()==200) { success = true; InputStream response = conn.getInputStream(); jsonReply = convertStreamToString(response); // Do JSON handling here.... }
строка JSON будет просто телом ответа, который вы получите от URL, который вы вызвали. Так что добавьте этот код
... BufferedReader in = new BufferedReader(new InputStreamReader( conn.getInputStream())); String inputLine; while ((inputLine = in.readLine()) != null) System.out.println(inputLine); in.close();Это позволит вам увидеть, что JSON возвращается на консоль. Единственная недостающая часть, которая у вас есть, - это использование библиотеки JSON для чтения этих данных и предоставления вам представления Java.
кроме того, если вы хотите проанализировать свой объект в случае ошибки http (400-5 * * коды), Вы можете использовать следующий код: (просто замените 'getInputStream' на 'getErrorStream':
BufferedReader rd = new BufferedReader( new InputStreamReader(conn.getErrorStream())); StringBuilder sb = new StringBuilder(); String line; while ((line = rd.readLine()) != null) { sb.append(line); } rd.close(); return sb.toString();
эта функция будет использоваться получить данные из url в виде объекта HttpResponse.
public HttpResponse getRespose(String url, String your_auth_code){ HttpClient client = new DefaultHttpClient(); HttpPost postForGetMethod = new HttpPost(url); postForGetMethod.addHeader("Content-type", "Application/JSON"); postForGetMethod.addHeader("Authorization", your_auth_code); return client.execute(postForGetMethod); }выше функция вызывается здесь, и мы получаем строковую форму json с помощью класса библиотеки Apache.И в следующих утверждениях мы пытаемся сделать простой pojo из JSON, который мы получили.
String jsonString = EntityUtils.toString(getResponse("http://echo.jsontest.com/title/ipsum/content/ blah","Your_auth_if_you_need_one").getEntity(), "UTF-8"); final GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.registerTypeAdapter(JsonJavaModel .class, new CustomJsonDeserialiser()); final Gson gson = gsonBuilder.create(); JsonElement json = new JsonParser().parse(jsonString); JsonJavaModel pojoModel = gson.fromJson( jsonElementForJavaObject, JsonJavaModel.class);Это простой класс модели java для включения json. публичный класс JsonJavaModel{ Содержимое строки; Заголовок строки; } Это обычай десериализатор:
public class CustomJsonDeserialiserimplements JsonDeserializer<JsonJavaModel> { @Override public JsonJavaModel deserialize(JsonElement json, Type type, JsonDeserializationContext arg2) throws JsonParseException { final JsonJavaModel jsonJavaModel= new JsonJavaModel(); JsonObject object = json.getAsJsonObject(); try { jsonJavaModel.content = object.get("Content").getAsString() jsonJavaModel.title = object.get("Title").getAsString() } catch (Exception e) { e.printStackTrace(); } return jsonJavaModel; }включить библиотеку Gson и org.апаш.http.утиль.EntityUtils;
Comments