精华内容
下载资源
问答
  • 解析Http方式返回Json数据出现 java.lang.IndexOutOfBoundException错误 问题代码如下:  public void onSuccess(ResponseInfo responseInfo) {  ListResponse response = ResponseParser  
    解析Http方式返回的Json数据出现
    

    java.lang.IndexOutOfBoundException错误

    问题代码如下:
                public void onSuccess(ResponseInfo<String> responseInfo) {
                    ListResponse<CommLoInfoEntity> response = ResponseParser
                            .toListResponse(responseInfo.result,
                                    CommCarCurrentLoInfoEntity.class);
                    if (response != null) {
                        List<CommLoInfoEntity> data = response.getData();
                        if (data != null) {

                               lastPoint = new LatLng(data.get(0).getLoLtt().doubleValue(), data.get(0).getLoLgt().doubleValue());

                       }

    返回结果:

    此时,response 不为null,执行 List<CommLoInfoEntity> data = response.getData();这句代码,虽然data 里面的没有任何元素,但是此时data  不为null,执行到data.get(0)这句便抛出异常,java.lang.IndexOutOfBoundException错误,Invalid index 0,size is 0


    更正后的代码:

         public void onSuccess(ResponseInfo<String> responseInfo) {
                    ListResponse<CommLoInfoEntity> response = ResponseParser
                            .toListResponse(responseInfo.result,
                                    CommCarCurrentLoInfoEntity.class);
                    if (response != null) {
                        List<CommLoInfoEntity> data = response.getData();
                        if (data.size() > 0) {

                               lastPoint = new LatLng(data.get(0).getLoLtt().doubleValue(), data.get(0).getLoLgt().doubleValue());

                       }


















    展开全文
  • JAVA 请求http接口返回json数据解析

    千次阅读 2017-09-07 15:22:22
     // 发送POST请求必须设置如下两行  context.setDoOutput(true);  context.setDoInput(true);  // 获取URLConnection对象对应的输出流  out = new PrintWriter(context.getOutputStream());  // ...
    /**
         * @param args
         */
        public static void main(String[] args) throws Exception{
            URL yahoo = new URL("http://www.baidu.com/query.jsp?param1=value2&param2=value2");

            URLConnection context = yahoo.openConnection();

            context.setRequestProperty("accept", "*/*");
            context.setRequestProperty("connection", "Keep-Alive");
            context.setRequestProperty("user-agent",sss
                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            // 发送POST请求必须设置如下两行
            context.setDoOutput(true);
            context.setDoInput(true);
            // 获取URLConnection对象对应的输出流
            out = new PrintWriter(context.getOutputStream());
            // 发送请求参数
           // out.print(param);
            // flush输出流的缓冲
            out.flush();

            InputStream br = context.getInputStream();  
            BufferedReader in = new BufferedReader(new InputStreamReader(br, "utf-8"));
            String inputLine;  
            String json ="";
            while ((inputLine = in.readLine()) != null)  
                json+=inputLine;//  System.out.println(inputLine);  
            in.close();

        

    System.out.println(json);


      JSONObject jsStr = JSONObject.fromObject(json);

           JSONArray jsar = JSONArray.fromObject(jsStr.getString("kaoHY"));
           List<Map> list = (List<Map>) jsar.toCollection(jsar, Map.class);
           for(Map employee : list){
               System.out.println(employee.get("ZJBM"));
           }
        }
      
    展开全文
  • 博主在做一款图书app的后台,最近遇到的一个需求: 前端向后端返回图书的isbn码,后端向前端...如果没有,则利用豆瓣开发者工具,进行查找,通过对接收到的信息进行解析,并插入到数据库中 前两步都没有问题,问...

    博主在做一款图书app的后台,最近遇到的一个需求:
    前端向后端返回图书的isbn码,后端向前端返回该isbn对应图书的信息,例如书名、作者、出版社、简介等。
    后端实现的逻辑:

    • 读取isbn码,判断是否为空,为空则报错
    • 查看数据库是否有与该isbn匹配的图书信息,如果有则直接返回
    • 如果没有,则利用豆瓣开发者工具,进行查找,通过对接收到的信息进行解析,并插入到数据库中

    前两步都没有问题,问题就在于第三步,我们需要完成:

    • 在java代码中,发送http的请求,以获取图书的信息
    • 豆瓣开发者工具返回的是JSON格式的文件,因此,我们需要将JSON格式的文件进行解析

    这两个问题也是比较常见的问题,我这里将分两个部分分别介绍:

    1.发送http请求

    public static void temp(String isbn) throws IOException{
        // 我们需要进行请求的地址:
        String temp = "https://api.douban.com/v2/book/isbn/" + isbn;
        try {
            // 1.URL类封装了大量复杂的实现细节,这里将一个字符串构造成一个URL对象
            URL url = new URL(temp);
            // 2.获取HttpURRLConnection对象
            HttpURLConnection connection = (HttpURLConnection)url.openConnection();
            // 3.调用connect方法连接远程资源
            connection.connect();
            // 4.访问资源数据,使用getInputStream方法获取一个输入流用以读取信息
            BufferedReader bReader = new BufferedReader(
                        new InputStreamReader(connection.getInputStream(), "UTF-8"));
    
            // 对数据进行访问
            String line = null;
            StringBuilder stringBuilder = new StringBuilder();
            while ((line = bReader.readLine()) != null) {
                stringBuilder.append(line);
            }
    
            // 关闭流
            bReader.close();
            // 关闭链接
            connection.disconnect();
            // 打印获取的结果
            System.out.println(stringBuilder.toString());
    
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
        }

    执行结果,我们获得Json包

    2.解析JSON包

    网上有不少文章在解释如何利用现成的jar包进行解析JSON文件的时候,很多都没有注明用了什么包,都是直接贴代码,看得一头雾水。
    https://blog.csdn.net/m0_37568521/article/details/78795029
    上面的连接是昨天看到的,一个博主贴出了使用了什么包
    这里写图片描述
    我将这6个包导入后,顺利实现了简单的转换:

    public static void temp(String isbn) throws IOException{
        // 我们需要进行请求的地址:
        String temp = "https://api.douban.com/v2/book/isbn/" + isbn;
        try {
            // 1.URL类封装了大量复杂的实现细节,这里将一个字符串构造成一个URL对象
            URL url = new URL(temp);
            // 2.获取HttpURRLConnection对象
            HttpURLConnection connection = (HttpURLConnection)url.openConnection();
            // 3.调用connect方法连接远程资源
            connection.connect();
            // 4.访问资源数据,使用getInputStream方法获取一个输入流用以读取信息
            BufferedReader bReader = new BufferedReader(
                        new InputStreamReader(connection.getInputStream(), "UTF-8"));
    
            // 对数据进行访问
            String line = null;
            StringBuilder stringBuilder = new StringBuilder();
            while ((line = bReader.readLine()) != null) {
                stringBuilder.append(line);
            }
    
            // 关闭流
            bReader.close();
            // 关闭链接
            connection.disconnect();
            // 打印获取的结果
            System.out.println(stringBuilder.toString());
    
            // 将获得的String对象转为JSON格式
            JSONObject jsonObject = JSONObject.fromObject(stringBuilder.toString());
            // 通过利用JSON键值对的key,来查询value
            System.out.println("book name : " + jsonObject.get("subtitle").toString());
            System.out.println("author : " + jsonObject.get("author").toString());
            System.out.println("summary : " + jsonObject.get("summary").toString());
    
            // 对于value也是JSON的对象,将对象的value转为一个新的JSON继续进行
            JSONObject aObject = JSONObject.fromObject(jsonObject.get("images").toString());
            System.out.println("images:  " + aObject.get("small").toString());
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
        }

    执行结果:
    这里写图片描述

    展开全文
  • 每个App都避免不了要进行网络请求,从最开始的用谷歌封装的volley到再到android-async-http再到OKHttpUtils再到现在的Retrofit和RxJava,从我自己用后的体验来看,用了retrofit和RxJava真的回不去了,回不去了,不去...

    每个App都避免不了要进行网络请求,从最开始的用谷歌封装的volley到再到android-async-http再到OKHttpUtils再到现在的Retrofit和RxJava,从我自己用后的体验来看,用了retrofit和RxJava真的回不去了,回不去了,不去了,去了,了...(哈哈,本来还想分析下这四个的区别,网上这样的文章很多,我就没必要多添乱了-.-)。不多逼逼,下面开始正文。

    1、Rxjava和Retrofit依赖导入:compile 'io.reactivex:rxandroid:1.2.0'                       //Rxjava专门针对anroid封装的RxAndroidcompile 'io.reactivex:rxjava:1.1.5'                          compile 'com.squareup.retrofit2:retrofit:2.0.2'              //retrofitcompile 'com.squareup.retrofit2:converter-gson:2.0.2'        //gson convertercompile 'com.squareup.retrofit2:adapter-rxjava:2.0.2'        //Retrofit专门为Rxjava封装的适配器compile 'com.google.code.gson:gson:2.6.2'                    //Gsoncompile 'com.squareup.okhttp3:logging-interceptor:3.1.2'     //打印网络请求的log日志

    2、网络请求基类的配置

    建立一个工厂类public class ServiceFactory {    private final Gson mGsonDateFormat;    public ServiceFactory(){

    mGsonDateFormat = new GsonBuilder()

    .setDateFormat("yyyy-MM-dd hh:mm:ss")

    .create();

    }    private static class SingletonHolder{        private static final ServiceFactory INSTANCE = new ServiceFactory();

    }    public static ServiceFactory getInstance(){        return SingletonHolder.INSTANCE;

    }    public  S createService(Class serviceClass){

    Retrofit retrofit = new Retrofit.Builder()

    .baseUrl(Constant.BASE_URL) //Retrofit2 base url  必须是这种格式的:http://xxx.xxx/

    .client(getOkHttpClient())

    --------------------------添加Gson工厂变换器也就是不用管数据解析-----------------------------------

    .addConverterFactory(GsonConverterFactory.create())

    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())

    .build();        return retrofit.create(serviceClass);

    }

    HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {        @Override

    public void log(String message) {            //打印retrofit日志

    Log.i("RetrofitLog","retrofitBack ======================= "+message);

    }

    });    private static final long DEFAULT_TIMEOUT = 10;    private OkHttpClient getOkHttpClient(){

    loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);        //定制OkHttp

    OkHttpClient.Builder builder = new OkHttpClient.Builder();

    builder.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);

    builder.writeTimeout(DEFAULT_TIMEOUT,TimeUnit.SECONDS);

    builder.addInterceptor(loggingInterceptor);        //设置缓存

    File httpCacheDirectory = new File(SDCardUtils.getRootDirectoryPath(),"这里是你的网络缓存存放的地址");

    builder.cache(new Cache(httpCacheDirectory,10*1024*1024));        return builder.build();

    }

    }

    好了 下一步 我们要建一个网络请求的基类,一般网络请求返回的数据最外层的根式就是 code msg result,可变的就是result,所以我们把result的类型定义为一个泛型的public class HttpResult extends BaseEntity {    public int code;    private boolean isSuccess;    private T result;    private String msg;    public void setMsg(String msg) {        this.msg = msg;

    }    public T getResult() {        return result;

    }    public void setResult(T result) {        this.result = result;

    }    public boolean isSuccess() {        return code == 200;

    }    public int getCode() {        return code;

    }

    }

    既然我们的网络请求是rxjava配合retrofit 下面就定义我们的网络请求订阅subscriberpublic abstract class HttpResultSubscriber extends Subscriber> {    @Override

    public void onNext(HttpResult t) {        if (t.isSuccess()) {

    onSuccess(t.getResult());

    } else {

    _onError(t.getMsg().getCode());

    }

    }    @Override

    public void onCompleted() {

    }    @Override

    public void onError(Throwable e) {

    e.printStackTrace();        //在这里做全局的错误处理

    if (e instanceof ConnectException ||

    e instanceof SocketTimeoutException ||

    e instanceof TimeoutException) {            //网络错误

    _onError(-9999);

    }

    }    public abstract void onSuccess(T t);    public abstract void _onError(int status);

    }

    OK我们的网络请求基类已经完成啦!下面开始我们的网络请求

    首先我们定义一个接口(以登录为例):public interface LoginService {    //这个例子是post为例,如果想要了解其他的网络请求,请点击文章开始出的retrofit链接

    @FormUrlEncoded

    @POST(Constant.LOGIN_URL)   这里是你的登录url    //可以看到我们的登录返回的是一个Observable,它里面包含的使我们的网络请求返回的实体基类,

    //而我们实体基类的result现在就是UserInfoEntity

    Observable> login(@Field("mobile") String phone,                                 @Field("password") String pwd);

    }

    现在开始我们的网络请求啦public void login(String phone, String pwd) {

    ServiceFactory.getInstance()

    .createService(LoginService.class)

    .login(phone,pwd)

    .compose(TransformUtils.>defaultSchedulers())

    .subscribe(new HttpResultSubscriber() {                @Override

    public void onSuccess(UserInfoEntity userInfoEntity) {                     //这是网络请求陈宫的回调

    }                @Override

    public void _onError(int status) {                    //这是失败的回调 根据status做具体的操作

    }

    });

    }

    你以为这样就行了 ,  这样子确实没毛病,确实已经妥妥的了。可是,可是,事与愿违啊!!!

    3、具体解决办法

    一般情况这是我们的返回json格式:{    "code":200,        "msg":"成功",        "result":{}

    }

    我们刚才定义登录接口的时候 返回的实体基类例传入的是UserInfoEntity  这确实是没问题的 可是你们加入登录失败的时候返回的json数据格式是这样的怎么办?

    {    "code":300,    "msg":"成功",    "result":[]

    }

    失败的时候返回的实体又是一个数组,这样子就会抱一个json解析异常拿不多失败的状态码和提示信息

    OK其实我们的网络请求已经完成90%了,剩下的就是不重要的失败的时候回调了。

    方法一:(这是在后台兄弟好说话,而且不打人的情况下...当然这种好人,还是有的,不过这不是我们今天要讲的重点)

    我们可以让后台返回的json数据中的result永远是个数组。{    "code":300,    "msg":"成功",    "result":[]

    }

    方法二:

    首先给大家看一个图片

    AAffA0nNPuCLAAAAAElFTkSuQmCC

    这就是我们要下手的地方

    上面我们添加的工厂变换器是导入的依赖 compile 'com.squareup.retrofit2:converter-gson:2.0.2' 这个提供的,

    那可能有人要问了,那我们不用这个用哪个啊,不着急,不着急。还好retrofit是支持自定义的ConverterFactory的

    下面我们就开始我们的自定义征程吧。

    ---------------------------------------------------------华丽丽的分割线-----------------------------------------------

    1、自定义Gson响应体变换器public class GsonResponseBodyConverter implements Converter{    private final Gson gson;    private final Type type;    public GsonResponseBodyConverter(Gson gson,Type type){        this.gson = gson;        this.type = type;

    }    @Override

    public T convert(ResponseBody value) throws IOException {

    String response = value.string();        //先将返回的json数据解析到Response中,如果code==200,则解析到我们的实体基类中,否则抛异常

    Response httpResult = gson.fromJson(response, Response.class);        if (httpResult.getCode()==200){            //200的时候就直接解析,不可能出现解析异常。因为我们实体基类中传入的泛型,就是数据成功时候的格式

    return gson.fromJson(response,type);

    }else {

    ErrorResponse errorResponse = gson.fromJson(response,ErrorResponse.class);            //抛一个自定义ResultException 传入失败时候的状态码,和信息

    throw new ResultException(errorResponse.getCode(),errorResponse.getMsg());

    }

    }

    }

    2、自定义一个响应变换工厂 继承自 retrofit的 converter.Factorypublic class ResponseConverterFactory extends Converter.Factory {    public static ResponseConverterFactory create() {        return create(new Gson());

    }    public static ResponseConverterFactory create(Gson gson) {        return new ResponseConverterFactory(gson);

    }    private final Gson gson;    private ResponseConverterFactory(Gson gson) {        if (gson == null) throw new NullPointerException("gson == null");        this.gson = gson;

    }    @Override

    public Converter responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {        //返回我们自定义的Gson响应体变换器

    return new GsonResponseBodyConverter<>(gson, type);

    }    @Override

    public Converter, RequestBody> requestBodyConverter(Type type,

    Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {        //返回我们自定义的Gson响应体变换器

    return new GsonResponseBodyConverter<>(gson,type);

    }

    }

    然后将上面的GsonConverterFactory.create() 替换成我们自定义的ResponseConverterFactory.create()。public  S createService(Class serviceClass){

    Retrofit retrofit = new Retrofit.Builder()

    .baseUrl(Constant.BASE_URL)

    .client(getOkHttpClient())            //.addConverterFactory(GsonConverterFactory.create())

    //然后将上面的GsonConverterFactory.create()替换成我们自定义的ResponseConverterFactory.create()

    .addConverterFactory(ResponseConverterFactory.create())

    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())

    .build();    return retrofit.create(serviceClass);

    }

    再然后,最后一个然后啦(-.-)

    在我们的自定义的Rxjava订阅者 subscriber中的onError()中加入我们刚才定义的ResultException。@Overridepublic void onError(Throwable e) {

    e.printStackTrace();    //在这里做全局的错误处理

    if (e instanceof ConnectException ||

    e instanceof SocketTimeoutException ||

    e instanceof TimeoutException) {        //网络错误

    _onError(-9999);

    } else if (e instanceof ResultException) {        //自定义的ResultException

    //由于返回200,300返回格式不统一的问题,自定义GsonResponseBodyConverter凡是300的直接抛异常

    _onError(((ResultException) e).getErrCode());

    System.out.println("---------errorCode------->"+((ResultException) e).getErrCode());

    }

    }

    这次是真的完成了我们的json数据解析异常的处理,其实我们的解决办法是解析了两次,第一次解析的时候我们的Response中只有只是解析了最外层的 code 和 msg  ,result中的是没有解析的。response中的code==200,直接将数据解析到我们的实体基类中。如果code!=200时,直接抛自定义的异常,直接会回调到subscriber中的onError()中。虽然进行了两次解析,但是第一次只是解析了code,和msg 对于效率的影响其实并不大,在功能实现的基础上一点点效率的影响(而且这个影响是微乎其微的-.-)其实无伤大雅的。

    展开全文
  • 封装成静态请求方法: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.ConnectException; import java.net....
  • 整ASIHTTPRequest和JSONKit花了我近三个晚上(20点到23点30)的时间,今天终于把后台返回的json串解析出来了,为了模拟真实的调用环境,用spring mvc搭了个简单的java后台...下面有一个按钮是批JSON解析 其实ASIHTTPR
  • http请求返回解析json数据

    千次阅读 2016-08-25 19:01:45
    Java代码 /* 注意get和post请求的发送区别 * 1、创建HttpGet(或HttpPost)对象,将要请求的URL通过构造方法传入HttpGet(或HttpPost)对象中; 2、使用DefaultHttpClient类的execute方法发送HTTP GET或HTTP...
  • json数据如下1{"description":"成功","returnCode":"000000","subedProducts":[]}{"description":"成功","returnCode":"000000","subedProducts":[]}解决方法:js解析方法:var data=" { root: [ {'name':'6200','...
  • 1、简单介绍一下Ajax(Asynchronous JavaScript and XML)异步请求: Ajax 不是一种新的编程语言,而是一种用于创建更好更快以及交互性更强的Web应用程序的技术。 2、简单介绍一下Json数据: JSON(JavaScriptObject...
  • JAVA 访问直接返回json的URL,并解析

    千次阅读 2018-10-29 10:28:18
    * @return //parm:请求的url链接 返回的是json字符串 */ public static String getURLContent() { SysSetup sysSetup = (SysSetup) ResourceManage.getContext("sysSetup");...
  • 请求得到的xml 1.首先我把请求的路径放到了配置文件里 2.通过Spring提供的注解来读取配置文件 3....进入主题,采用don4j来解析xml@RequestMapping("/getAllNotAcceptedCaseList")@ResponseBodypubli...
  • 简单的说,就是要实现java对象转化为json对象,下面采取两种实现方法,一种是fastjson解析器,另外一种爱用jackjson 一、采用fastjson结合springmvc的方式 1、引入依赖 <!--锁定所有spring的版本--> <...
  • java json解析(转)

    2019-10-02 02:04:39
    给服务端发送请求后,服务端会返回一连串的数据,这些数据在大部分情况下都是XML格式或者JSON格式。然后JSON相对XML来说解析相对方便一些,所以先说说JSON解析JSON的基本数据格式有这几种: 1.一个JSON对象...
  • java.lang.IllegalStateException: Expected BEGIN_OBJECT but was NUMBER at ...你去解析时是以BEGIN_OBJECT接收解析的,但是返回却是一个NUMBER 型的,所以把接收解析对象换成NUMBER 即可!其他同样的犯错也是如此
  • 1.开发环境 客户端:Android Studio 3.0.1 服务端:Eclipse 2.客户端 (1)AS新建一个项目,然后要使用Retrofit2.0 添加依赖和权限 ... //retrofit2 依赖库 ... //Gson 数据解析器依赖库 impl...
  • 概述日常开发的时候,避免不了与后台打交道,最常见的就是前端发送请求,后台返回数据,然后将拿到的数据进行展示。现在我们开始模仿一个基本的网络请求,这里使用wanandroid提供的开放api作为请求对象,地址:...
  • 使用eval函数来解析,并且使用jquery的each方法来遍历用jquery解析JSON数据的方法,作为jquery异步请求的传输对象,jquery请求后返回的结果是json对象,这里考虑的都是服务器返回JSON形式的字符串的形式,对于利用...
  • 索引背景简介获取网站的数据传输方式Java使用Post方式提交Http请求Java利用alibaba.fastjson解析JSON 背景简介 期末考完了闲得无聊,看到群里面某位兄台写了个爬虫通过学校临时成绩查询系统批量获取学生成绩(这儿...
  • 请求得到的xml 1.首先我把请求的路径放到了配置文件里 2.通过Spring提供的注解来读取配置文件 3.如果测试读取不到配置路径,检查一下有没有讲配置文件加到SpringContext容器里(在Spring-mvc,xml里配置) ...
  • 简单说一下背景上次后端通过模拟http请求百度地图接口,得到的是一个json字符串...顺便说一下所解析的字符串一定要是“{”开始,“}”结束,而百度地图返回数据是这样的renderReverse&&renderReverse({"stat...
  • github地址:https://github.com/furtech/java_utils/blob/master/src/main/java/com/furtech/javautils/HttpRequestUtil.java 代码中有详细说明(就不过多解释了) 依赖如下: //codeStatus compile 'commons-...
  • java发起http请求获取返回Json对象

    万次阅读 2017-07-05 19:51:40
    第一个方法,发送get请求获取后台数据,其中,将返回回来的字符串解析json对象用到了google的Gson.jar包,用到了其中JsonParser的parse方法。 第二个方法,发送post数据到后台并获取后台数据。
  • 4.4 JSON解析

    2020-07-01 01:10:35
    目前,主流的JSON解析框架有org.json、Gson以及阿里巴巴开源的Fastjson,本节以Fastjson为例演示如何解析JSON字符串。 1.引入依赖 Fastjson是阿里巴巴公司基于Java语言开发的高性能且完善的JSON操作类库。使用前,在...

空空如也

空空如也

1 2 3 4 5 ... 17
收藏数 333
精华内容 133
关键字:

java请求返回json解析

java 订阅