Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从HttpURLConnection对象解析JSON_Java_Html_Json_Parsing_Httpurlconnection - Fatal编程技术网

Java 从HttpURLConnection对象解析JSON

Java 从HttpURLConnection对象解析JSON,java,html,json,parsing,httpurlconnection,Java,Html,Json,Parsing,Httpurlconnection,我正在用Java中的HttpURLConnection对象进行基本的http身份验证 URL urlUse = new URL(url); HttpURLConnection conn = null; conn = (HttpURLConnection) urlUse.openConnection(); conn.setRequestMethod("GET"); conn.setRequestProperty("Co

我正在用Java中的
HttpURLConnection
对象进行基本的http身份验证

        URL urlUse = new URL(url);
        HttpURLConnection conn = null;
        conn = (HttpURLConnection) urlUse.openConnection();
        conn.setRequestMethod("GET");
        conn.setRequestProperty("Content-length", "0");
        conn.setUseCaches(false);
        conn.setAllowUserInteraction(false);
        conn.setConnectTimeout(timeout);
        conn.setReadTimeout(timeout);
        conn.connect();

        if(conn.getResponseCode()==201 || conn.getResponseCode()==200)
        {
            success = true;
        }

我希望是一个JSON对象,或者是一个有效JSON对象格式的字符串数据,或者是一个包含有效JSON的简单纯文本的HTML。在它返回响应后,如何从
HttpURLConnection
访问它?

定义以下函数(不是我的,不确定很久以前在哪里找到的):

}

然后:


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表示


您可以使用以下方法获取原始数据。顺便说一句,此模式适用于Java6。如果您使用java 7或更新,请考虑./P> 然后可以使用返回的字符串将JSON映射到指定类的对象,如下所示:

String data = getJSON("http://localhost/authmanager.php");
AuthMsg msg = new Gson().fromJson(data, AuthMsg.class);
System.out.println(msg);
{"code":1,"message":"Logged in"}
有一个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必须如下所示:

String data = getJSON("http://localhost/authmanager.php");
AuthMsg msg = new Gson().fromJson(data, AuthMsg.class);
System.out.println(msg);
{"code":1,"message":"Logged in"}

关于

此外,如果您希望在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();

此函数将用于以HttpResponse对象的形式从url获取数据

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);
}
上面的函数在这里调用,我们使用Apache库类接收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);
这是一个用于输入json的简单java模型类。 公共类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;
}
公共类CustomJSondeSerializer实现JsonDeserializer{
@凌驾
公共JsonJavaModel反序列化(JsonElement json,类型,
JsonDeserializationContext arg2)引发JsonParseException{
最终JsonJavaModel JsonJavaModel=新JsonJavaModel();
JsonObject object=json.getAsJsonObject();
试一试{
jsonJavaModel.content=object.get(“content”).getAsString()
jsonJavaModel.title=object.get(“title”).getAsString()
}捕获(例外e){
e、 printStackTrace();
}
返回jsonJavaModel;
}

包括Gson库和org.apache.http.util.EntityUtils;

请注意,所有2xx http状态代码都表示成功。我可以问您,您在哪里关闭连接
c
?最初,我使用try with resources以java 7的方式编写了这篇文章,但有人决定保留java 6,因此最终忽略了连接关闭。但是的,连接必须已关闭。我将稍后编辑此内容,谢谢。@kbec我仍然看不到您在哪里关闭连接。请将此添加到您的答案中好吗?@kbec HttpURLConnection没有关闭您的意思是
disconnect()
?可能,捕获MalformedURLException是无用的,因为已经存在IOException?
convertStreamToString
不会在传输过程中丢失连接时通知调用代码字符串不完整。通常,最好让异常冒泡。如果读取了异常,则不会关闭输入缓冲区正在对输入进行初始化。
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;
}