精华内容
下载资源
问答
  • JSON三种数据解析方法

    万次阅读 多人点赞 2018-01-15 13:05:01
    引言 JSON数据现在是我们开发中用的最多的,百分之八十的数据都是通过JSON方式进行传输,那么想要学好JSON解析就要了解什么是JSON数据,怎么快速解析它从而提升开发效率。

    JSON数据现在是我们开发中用的最多的,百分之九十的数据都是通过JSON方式进行传输,那么想要学好JSON解析就要了解什么是JSON数据,怎么快速解析它从而提升开发效率。

    1 什么是JSON数据?

    • 先看下面,这里有一段JSON数据,我们根据这段数进行讲解:
    {
      "paramz": {
        "feeds": [
          {
            "id": 299076,
            "oid": 288340,
            "category": "article",
            "data": {
              "subject": "荔枝新闻3.0:不止是阅读",
              "summary": "江苏广电旗下资讯类手机应用“荔枝新闻”于近期推出全新升级换代的3.0版。",
              "cover": "/Attachs/Article/288340/3e8e2c397c70469f8845fad73aa38165_padmini.JPG",
              "pic": "",
              "format": "txt",
              "changed": "2015-09-22 16:01:41"
            }
          }
        ],
        "PageIndex": 1,
        "PageSize": 20,
        "TotalCount": 53521,
        "TotalPage": 2677
      }
    }
    

    其实JSON数据就是一段字符串而已,只不过有不同意义的分隔符将其分割开来而已,我们看上面的符号,里面有[] ,{}等符号,其中

    • 1 []中括号代表的是一个数组;
    • 2 {}大括号代表的是一个对象
    • 3 双引号“”表示的是属性值
    • 4 冒号:代表的是前后之间的关系,冒号前面是属性的名称,后面是属性的值,这个值可以是基本数据类型,也可以是引用数据类型。

    2 了解了JSON数据的格式,怎么对这段数据进行解析呢?

    JSONObject系统自带的解析方式解析,我们先来JSONObject(系统自带的类)类中的方法:

    这里写图片描述

    • 上面用红框框出来的是我们手动解析最常用的方法了,好了,现在我们想要解析上面的一段数据,该怎么做呢?这里我写了一个解析类如下:
    public class JsonUtils {
    
        /**
         * 根据json数据解析返回一个List<HashMap<String, Object>>集合
         * @param json  json数据
         * @return
         */
        public static List<HashMap<String, Object>> getJsonList(String json) {
            List<HashMap<String, Object>> dataList;
            dataList = new ArrayList<>();
            try {
                JSONObject rootObject = new JSONObject(json);
                JSONObject paramzObject = rootObject.getJSONObject("paramz");
                JSONArray feedsArray = paramzObject.getJSONArray("feeds");
                for (int i = 0; i < feedsArray.length(); i++) {
                    JSONObject sonObject = feedsArray.getJSONObject(i);
                    JSONObject dataObject = sonObject.getJSONObject("data");
                    String subjectStr = dataObject.getString("subject");
                    String summaryStr = dataObject.getString("summary");
                    String coverStr = dataObject.getString("cover");
                    HashMap<String, Object> map = new HashMap<>();
                    map.put("subject", subjectStr);
                    map.put("summary", summaryStr);
                    map.put("cover", coverStr);
                    dataList.add(map);
                }
                return dataList;
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return null;
        }
    }
    

    相信很简单一看就懂了吧,此方法写起来主要是比较费时间罢了,无非就是几个方法不停的调用而已,所以显得特别的费时费力,下面我又写了一个解析的方法,方法中会有一些冗余的代码,是为了更加深刻理解JSON解析而写的,实际中可以删掉,也用了一行GSON解析,GSON解析下面会见讲到:

    其中DataModel对象我是将data对象使用GsonFormat插件工具生成的,使用方式可以自行搜索

    public class DataModel {
    
        /**
         * subject : "荔枝新闻3.0:不止是阅读"
         * summary : "江苏广电旗下资讯类手机应用“荔枝新闻”于近期推出全新升级换代的3.0版。"
         * cover : "/Attachs/Article/288340/3e8e2c397c70469f8845fad73aa38165_padmini.JPG"
         * pic :
         * format : video
         * changed : 2015-11-07 14:35:22
         */
    
        public String subject;
        public String summary;
        public String cover;
        public String pic;
        public String format;
        public String changed;
    
        @Override
        public String toString() {
            return "DataModel{" +
                    "subject='" + subject + '\'' +
                    ", summary='" + summary + '\'' +
                    ", cover='" + cover + '\'' +
                    ", pic='" + pic + '\'' +
                    ", format='" + format + '\'' +
                    ", changed='" + changed + '\'' +
                    '}';
        }
    }
    
     /**
         * 根据json对象获取List<DataModel>集合
         * @param json 数据
         * @return
         */
        public static List<DataModel> getGsonList(String json) {
            List<DataModel> dataList;
            try {
                JSONObject rootObject = new JSONObject(json);
                JSONObject paramzObject = rootObject.getJSONObject("paramz");
    
                /**
                 * JSONArray的构造方法获取JSONArray对象
                 */
                JSONArray jsonArray = new JSONArray(paramzObject.getString("feeds"));
                Log.i(TAG, "jsonarray.length():"+jsonArray.length());
    
                /**
                 * 获取JSONObject对象的属性关键字
                 */
                Iterator<String> iterators = paramzObject.keys();
                while (iterators.hasNext()) {
                    Log.i(TAG, "iterators: " + iterators.next());
                }
                JSONArray feeds = paramzObject.getJSONArray("feeds");
                dataList = new ArrayList<>();
                for (int i = 0; i < feeds.length(); i++) {
                    JSONObject jsonObject = feeds.getJSONObject(i);
                    DataModel model = new Gson().fromJson(jsonObject.getString("data"), new TypeToken<DataModel>() {
                    }.getType());
                    Log.i(TAG, "DataModel: " + model.toString());
                    dataList.add(model);
                }
                return dataList;
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
            return null;
        }
    

    简单总结一下上面的解析吧:

    1 对于JSONObject对象来说,想要得到一个JSONObject对象通常可以通过

    • (a):构造方式:JSONObject(String json)-> JSONObject rootObject = new JSONObject(json);
    • (b):JSONObject getJSONObject(String name){}-> JSONObject paramzObject = rootObject.getJSONObject(“paramz”);

    2 对于JSONArray对象来说,想要得到一个JSONArray对象通常可以通过

    • (a):构造方式:JSONArray(String json)->JSONArray jsonArray = new JSONArray(paramzObject.getString(“feeds”));
    • (b):JSONObject getJSONObject(String name){}-> JSONArray feeds = paramzObject.getJSONArray(“feeds”);

    3 Gson解析

    我们如果懂得了上面的手动解析方式的话,那么对于Gson解析而言,就太简单了,下面我们就开始解析下面一段JSON数据:

    {
        "homeadlist": [
            {
                "id": 1,
                "imgurl": "/img/homead/a73b3f1d-0f14-429d-9d0f-70643fb0f0eb.jpg",
                "jumpflag": 0,
                "jumpurl": "",
                "posflag": 1,
                "remark": "1111",
                "cityid": 1
            },
            {
                "id": 12,
                "imgurl": "/img/homead/eb442fbf-49db-4ba6-a102-d781505f426d.jpg",
                "jumpflag": 0,
                "jumpurl": "",
                "posflag": 2,
                "remark": "",
                "cityid": 1
            },
            {
                "id": 14,
                "imgurl": "/img/homead/68109460-635d-4c5c-8be8-64d7c7889d18.jpg",
                "jumpflag": 0,
                "jumpurl": "http://shiranlife.kuaizhan.com/",
                "posflag": 4,
                "remark": "",
                "cityid": 1
            }
        ]
    }
    

    首先我们使用GsonFormat工具生成一个类HomeadListModel:

    public class HomeadListModel {
    
        /**
         * code : 1
         * data : {"homeadlist":[{"id":1,"imgurl":"/img/homead/a73b3f1d-0f14-429d-9d0f-70643fb0f0eb.jpg","jumpflag":0,"jumpurl":"","posflag":1,"remark":"1111","cityid":1},{"id":12,"imgurl":"/img/homead/eb442fbf-49db-4ba6-a102-d781505f426d.jpg","jumpflag":0,"jumpurl":"","posflag":2,"remark":"","cityid":1},{"id":14,"imgurl":"/img/homead/68109460-635d-4c5c-8be8-64d7c7889d18.jpg","jumpflag":0,"jumpurl":"http://shiranlife.kuaizhan.com/","posflag":4,"remark":"","cityid":1}]}
         */
    
        public int code;
        public DataBean data;
    
        public static class DataBean {
            public List<HomeadlistBean> homeadlist;
    
            public static class HomeadlistBean {
                public int id;
                public String imgurl;
                public int jumpflag;
                public String jumpurl;
                public int posflag;
                public String remark;
                public int cityid;
            }
        }
    }
    
    

    我们使用OKHttpClient,代码如下

    OkHttpClient.Builder builder = new OkHttpClient.Builder();
    
            Request request = new Request.Builder()
                    .url(url)
                    .get()
                    .build();
    
            builder.build().newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
    
                }
    
                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    Gson gson = new Gson();
                    /**
                     * java.lang.IllegalStateException: closed
                     * 因为OkHttp请求回调中response.body().string()只能有效调用一次
                     *
                     */
    
                    String string = response.body().string();
                    Log.i("aaa", "response: " + string);
                    /**
                     * 重新构建一个response 因为response.body().string()调用一次之后流就断掉了,只能有效调用一次
                     */
                    MediaType mediaType = response.body().contentType();
                    Response response1 = response.newBuilder().body(ResponseBody.create(mediaType, string)).build();
                    String string1 = response1.body().string();
                    Log.i("aaa", "response1: " + string1);
                    /**
                     * 将json数据转换为对象
                     */
                    HomeadListModel model = gson.fromJson(string1, HomeadListModel.class);
                    //HomeadListModel model2 = gson.fromJson(string1, new TypeToken<HomeadListModel>() {
                    }.getType());
                    /**
                     * 将对象转换为json数据
                     */
                    String jsonString = gson.toJson(model);
                    Log.i("aaa", "onResponse2: " + jsonString);
    
                    for (HomeadListModel.DataBean.HomeadlistBean data : model.data.homeadlist) {
                        mData.add(imageUrl + data.imgurl);
                    }
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            mAdapter.notifyDataSetChanged();
                        }
                    });
                }
            });
    

    我们想要将一个json数据转换为对象的话需要使用fromJson(String json, Class classOfT) /fromJson(String json, Type typeOfT),当我们需要将对象转换为String的时候根据String toJson(Object src)方法即可。这里需要注意一点,如果response.body().string()调用大于一次的话,就会报错java.lang.IllegalStateException: closed,因为response.body().string()调用一次之后流就断掉了,需要重新构建一个response;


    4 FastJson解析

    • 这个解析和Gson解析差不多,也是一行就搞定了,也是对上面的Gson数据进行解析,想要将json数据解析成对象需要使用 parseObject()方法,参数可以传Class,也可以传Type;当需要通过对象得到String字符串时候使用String json1 = JSONObject.toJSONString(model)即可,下面贴上代码:
    OkHttpClient.Builder builder = new OkHttpClient.Builder();
            Request request = new Request.Builder()
                    .url(url)
                    .get()
                    .build();
            builder.build().newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
    
                }
    
                @Override
                public void onResponse(Call call, Response response) throws IOException {
    
                    String json = response.body().string();
                    /**
                     * 根据json数据获取对象
                     */
                    HomeadListModel model = JSONObject.parseObject(json, new TypeToken<HomeadListModel>() {
                    }.getType());
    //                HomeadListModel model2 = JSONObject.parseObject(json, HomeadListModel.class);
    
                    /**
                     * 根据对象获取json数据
                     */
                    String json1 = JSONObject.toJSONString(model);
                    Log.i("aaa", "fastJson: " + json1);
    
                    for (HomeadListModel.DataBean.HomeadlistBean data : model.data.homeadlist) {
                        mData.add(imageUrl + data.imgurl);
                    }
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            mAdapter.notifyDataSetChanged();
                        }
                    });
                }
            });
    

    结尾:上面写了三种解析JSON数据的方法,第一种是最麻烦的,但是不一定是最差的,后面两种Gson和FastJson都是最常用的方法,本博客里面用到的API也是最常用的API,基本开发都够用了,其余未涉及到的请自行查看源码学习吧。


    想要系统学习Android知识体系的,可以免费关注我的博客和Github,你的关注和支持是每一个技术人前进的动力。

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • 后台返回json数据和前台解析json数据 一般来说web开发中,前台采用json数据提交给后台,后台处理数据以后返回json数据给前台,前台解析json,显示数据。 总而言之,前后台直接交换的数据格式最常用的非json数据...

    后台返回json数据给前台和前台解析json数据(总结)

    一般来说web开发中,前台采用json数据提交给后台,后台处理数据以后返回json数据给前台,前台解析json,显示数据。
    总而言之,前后台直接交换的数据格式最常用的非json数据无疑了。
    这里就总结一些json数据的前后台处理方式。

    1.JSON数据

    JSON(JavaScript Object Notation, JS 对象简谱)

    是一种轻量级的数据交换格式,比xml更轻巧(由于 JSON 所使用的字符要比 XML 少得多,可以大大得节约传输数据所占用的带宽)。

    json是javascript原生格式,就是说在javascript中处理json数据,需要引用其他API或工具包。

    简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

    只需要记住!
    Json是一种文本字符串!被存储在responseText属性中,而读取json数据可以使用javascript的eval函数来解析json。

    2.json规则:

    在 JS 语言中,一切都是对象,对象是一个无序的 “键/值” 对集合
    因此,任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型:
    • 对象表示为键值对.
    • 数据由逗号分隔.
    • 花括号{}保存对象.
    • 方括号[]保存数组.

    键/值对组合中的键名写在前面并用双引号 “” 包裹,使用冒号 : 分隔,然后紧接着值:

    {"firstName": "Json"}
    

    这很容易理解,等价于这条 JavaScript 语句:

    {firstName : "Json"}
    

    对象在 JS 中是使用花括号包裹 {} 起来的内容,数据结构为 {key1:value1, key2:value2, …} 的键值对结构。

    在面向对象的语言中,key 为对象的属性,value 为对应的值。

    键名可以使用整数和字符串来表示,值的类型可以是任意类型。

    数组在 JS 中是方括号 [] 包裹起来的内容,数据结构为 [“java”, “javascript”, “vb”, …] 的索引结构。

    在 JS 中,数组是一种比较特殊的数据类型,它也可以像对象那样使用键值对,但还是索引使用得多。同样,键名可以使用整数和字符串来表示,值的类型可以是任意类型。

    3.JSON 与 JS 对象的关系:

    很多人搞不清楚 JSON 和 Js 对象的关系,甚至连谁是谁都不清楚。其实,可以这么理解:
    JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串
    如:

    var obj = {a: 'Hello', b: 'World'};    //这是一个对象,注意键名也是可以使用引号包裹的
    var json = '{"a": "Hello", "b": "World"}';  //这是一个 JSON 字符串,本质是一个字符串
    

    4.后台返回json数据

    一般来说,使用JsonObject来将Java类型数据转换成Json类型,首先要下载该库相关的jar包,下载地址如下:

    json-jar包下载

    JsonObject的使用:
    后台controller部分代码:

    JSONObject object = new JSONObject();  //创建Json对象
    object.put("username", "张三");         //设置Json对象的属性
    object.put("password", "123456");
    System.out.println(object.toString());  //调用toString方法将json对象转换成json字符串
    
    //把json数据返回给浏览器:
    PrintWriter out = cu.getWriterOut(response);
    out.print(object.toString());
    //或者
    response.getWriter().write(jsonObject.toString());
    
    

    5.在JavaScript代码中接收Json数据:

    假设result为浏览器得到的json数据,可以使用以下js代码可以将json对象转换为字符串。

    比如:

    通过$.get从后台获取了一段json串{“id”:“1”,“name”:“ww”},然后要拿到这里面的id和name值:

    注意!注意!注意!
    如果你直接这么写!

    $.get(url,
         function(data) {
           alert("ID:" + data.id + "\nName:" + data.name);
         });
    

    直接这样写的话,界面会alert提示undefined,因为没能正确解析返回的字符串。

    图示:
    在这里插入图片描述

    解决方案:

    1、 需要用eval()函数

    将返回的串转化成可用的strig串,eval(data),但是因为原串里面是以{}开始和结束的,会被认为是可执行方法,因此需要加上()包围起来,最终形成:

    var jsonobj= eval('(' + data + ')');  // 把JSON字符串解析为javascript对象
    

    然后再

    alert("ID:" + jsonobj.id + "\nName:" + jsonobj.name);
    

    各种正常的按key取值,就能正常显示了。

    2、获取的时候就直接表示返回的是json格式,用 . g e t J S O N 代 替 .getJSON代替 .getJSON.get,其他代码不变,也能正常获取。

    也可以直接获取json对象的属性,如下:console.log(result.username);

    前端js代码:

    $.ajax({
    url: url,
    type: "POST",
    data: parameters,
    dataType:"json",
    async: false,
    success: function(result){
    var newData = JSON.stringify(result);    //将json对象转换为字符串
    newData = eval("("+newData+")");   /解析json
    
    var annualDays = newData.annualDays;
    var entryDate = newData.entryDate;
    
    $("input[name='extendDataFormInfo.value(fd_shengyu_nianjia)']").val(annualDays);
    $("input[name='extendDataFormInfo.value(fd_ruzhi_date)']").val(entryDate);
    
    }});
    
    

    ps: 注意注释中的代码,如果少了这一句,那么直接alert(result);得到的结果会是

    在这里插入图片描述

    所以在这里stringfy()的作用是用于从一个对象解析出字符串
    加上了var newData = JSON.stringify(result);这句,然后你再alert(newData);
    得到的就会是你想要的结果,如下:
    在这里插入图片描述

    另外:
    如果返回的json数据格式不是很规范的解决办法:

    判断后台返回的数据格式是否字符串,是则转,不是则不转?

      var $obj = (typeof data.content == 'string') ? JSON.parse(data.content):data.content
    

    总结:

    1. 前台发送请求,并且设置数据为json格式‘
        $.ajax({
        url:"selectByid.",
        datatype:'json',
        data:{id:id}, // 发送数据 
    
    1. 数据回调函数
    success:function(data){
    alert(data);
    var json = eval("("+data+")");//将json类型字符串转换为json对象
    alert("hjf"+json.name);
    
    1. 给对应的input赋值:
    $("#id").val(json.id),
    $("#name").val(json.name),
    $("#age").val(json.age);
    
    1. 后台代码:返回json数据
    response.getWriter().print(str);    //将数据返回前台ajax
    

    6.前端ajax接不到json解决?

    在前台:

    async:false,                //加上这个属性就好了
    

    7.返回的json字符串中有转义符解决?

    比如:

    "result":"{\"id\":\"60\",\"qid\":\"1\",\"bazi\":\"baiz\",\"shenxiao\":\"\",\"xingzuo\":\"\",\"wuge\":\"\",\"jianyi\":\"\",\}"
    

    这样我们我们使用JSON.parse(result) ,直接转化为json的话是会报错的。

    解决方法:
    我们先把转义符用正则表达式去掉,

       var string = result.replace("/\\","");
       var getDataArray = JSON.parse(string)
    

    这样就OK了,不过要注意有时候也是需要指定返回数据类型的
    dataType:“json”

    8.使用其他的json依赖包方式:

    引入阿里巴巴的json依赖包:

        <dependency>
         <groupId>com.alibaba</groupId>
         <artifactId>fastjson</artifactId>
         <version>1.2.9</version>
        </dependency>
    

    模拟后台:

        String params="{\"channelCode\":\"bbb\",\"accountNo\":\"121300000932\",\"message\":\"字符信息解密成功\",\"status\":\"1\"}";
        JSONObject pa=JSONObject.parseObject(params);
        System.out.println(pa.getString("message"));
    

    结果:
    在这里插入图片描述

    或者:
    引入net.sf.json-lib依赖包:

        <dependency>
          <groupId>net.sf.json-lib</groupId>
          <artifactId>json-lib</artifactId>
          <version>2.4</version>		 
          <classifier>jdk15</classifier>
        </dependency>
    

    后台:

    String params="{\"channelCode\":\"ccy\",\"accountNo\":\"121300000932\",\"message\":\"字符信息解密成功\",\"status\":\"1\"}";
    JSONObject pa=JSONObject.fromObject(params);
    String accountNo=pa.getString("accountNo");
    System.out.println(accountNo);
    

    结果:
    在这里插入图片描述

    9.后台对象转换json数据返回给前台

    List集合转换成json代码:

      List list = new ArrayList();
      list.add( "first" );
      list.add( "second" );
      JSONArray jsonArray2 = JSONArray.fromObject( list );
    

    Map集合转换成json代码:

       Map map = new HashMap();
      map.put("name", "json");
      map.put("bool", Boolean.TRUE);
      map.put("int", new Integer(1));
      map.put("arr", new String[] { "a", "b" });
      map.put("func", "function(i){ return this.arr[i]; }");
      JSONObject json = JSONObject.fromObject(map);
    

    或者在项目中加入引入JSON-lib包,JSON-lib包同时依赖于以下的JAR包:
    下载地址

      1.commons-lang.jar
      2.commons-beanutils.jar
      3.commons-collections.jar
      4.commons-logging.jar 
      5.ezmorph.jar
      6.json-lib-2.2.2-jdk15.jar
    

    用法同上

      JSONObject jsonObject = JSONObject.fromObject(message);
      getResponse().getWriter().write(jsonObject.toString());
    

    当把数据转为json后,用如上的方法发送到客户端。前端就可以取得json数据了。(可以参考最下面的实例)

    10.后台返回数据给前台,json中文乱码解决方法

    在实际运用场景中,当前台发起请求后,我们需要从后台返回数据给前台,这时,如果返回的数据中包含中文,则经常会出现在后台查询出来都是好好,但是传输回去就莫名的乱码了,而且即使在 web.xml 中进行编码过滤了,但还是乱码。

    解决办法:
    只需要在 spring-mvc.xml 配置文件中配置一次就好,省去了我们重复写的麻烦,配置内容如下:

    <!--自定义消息转换器的编码,解决后台传输json回前台时,中文乱码问题-->
        <mvc:annotation-driven >
            <mvc:message-converters register-defaults="true">
                <bean class="org.springframework.http.converter.StringHttpMessageConverter" >
                    <property name = "supportedMediaTypes">
                        <list>
                            <value>application/json;charset=utf-8</value>
                            <value>text/html;charset=utf-8</value>
                            <!-- application 可以在任意 form 表单里面 enctype 属性默认找到 -->
                            <value>application/x-www-form-urlencoded</value>
                        </list>
                    </property>
                </bean>
                <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" ></bean>
            </mvc:message-converters>
        </mvc:annotation-driven>
    

    加上这段配置,保存重新运行,再次访问,会发现,原先的中文乱码都已经正常显示了。

    方法二:在后台的方法映射添加:

    @RequestMapping(value="/getphone",produces = “text/plain;charset=utf-8”)

    11.Spring MVC返回json数据的方式

    1. 采用@ResponseBody注解

    @ResponseBody 注解的作用是:

    将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据,需要注意的呢,在使用此注解之后不会再走试图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。

    使用举例:
    在这里插入图片描述

    使用@ResponseBody 注解返回响应体 直接将返回值序列化json
    优点:不需要自己再处理

    再举例:

    RequestMapping("/login")
      @ResponseBody
      public User login(User user){
        return user;
      }
    

    使用@ResponseBody 注解返回响应体 直接将返回值序列化json。

    User字段:userName pwd,那么在前台接收到的数据为:’{“userName”:“xxx”,“pwd”:“xxx”}’,效果等同于如下代码:

    @RequestMapping("/login")
    public void login(User user, HttpServletResponse response){
       response.getWriter.write(JSONObject.fromObject(user).toString());
    }
    
    

    需要在springmvc的配置文件xml中添加:

    <mvc:annotation-driven/>  
    

    2. 采用工具类,进行json格式转换带回

    JSON-lib包是一个beans,collections,maps,java arrays 和XML和JSON互相转换的包。在本例中,我们将使用JSONObject类创建JSONObject对象,然后我们打印这些对象的值。为了使用JSONObject对象,我们要引入"net.sf.json"包。为了给对象添加元素,我们要使用put()方法。

    要使程序可以运行必须引入JSON-lib包,JSON-lib包同时依赖于以下的JAR包:

    commons-lang.jar
    commons-beanutils.jar
    commons-collections.jar
    commons-logging.jar 
    ezmorph.jar
    json-lib-2.2.2-jdk15.jar
    

    效果:在这里插入图片描述

    工具类:
    ResponseUtil.java

    package com.zout.utils;
    import java.io.PrintWriter;
    import javax.servlet.http.HttpServletResponse;
    import net.sf.json.JSONArray;
    import net.sf.json.JSONObject;
    
    /**
     *@class_name:ResponseUtil  
     *@param: EasyUi-响应工具类
     *@return: 返回字符串格式数据、result是JSONObject对象(json对象)
     *@author:Zoutao
     *@createtime:2018年3月8日
     */
    public class ResponseUtil {
    	public static void write(HttpServletResponse response, Object result)
    			throws Exception {
    		response.setContentType("text/html;charset=utf-8");
    		response.addHeader("Access-Control-Allow-Origin", "*");
    		PrintWriter out = response.getWriter();
    		out.println(result.toString());
    		System.out.println("带回的json字符串为:"+result.toString()+"类型为:"+result.getClass().getName());
    		out.flush();
    		out.close();
    	}
    	
    	public static void main(String[] args) throws Exception {
    		/*在web运用控制层中调用如下:*/
    		JSONObject result = new JSONObject(); //创建json对象
    		JSONArray jsonArray = JSONArray.fromObject("name:zhangsan"); //字符串转为json数组
    		result.put("rows", jsonArray);  //放入json数组中,并起个名字
    		HttpServletResponse response = null; //jsp的response对象
    		ResponseUtil.write(response, result); //result写入response带回前台,jsp按名字拿取。
    	}
    }
    
    

    后台具体调用:

    	JSONObject result = new JSONObject();
    			if (resultTotal > 0) {		//处理结果
    				System.out.println("操作成功。");
    				result.put("success",true)
    				result.put("message","操作成功"); //消息语句
    			} else {
    				System.out.println("操作失败。");
    				result.put("success", false);			
    				result.put("message","操作失败");
    			}
    			ResponseUtil.write(response,result); //带回字符串+状态码
    			return null;
    

    图:
    在这里插入图片描述

    后台已经通过工具类封装为json字符串了,使用response带回需要的数据,使用result带回状态字符串或状态码。

    前台:
    这是当成返回一个json字符串,然后直接采取字符串截取的方式,取出消息语句message等消息。
    在这里插入图片描述

    这是另外一种写法:就是解析传回来的json字符串我js的对象,然后按照key/value的取值。

      function (data) {
              var data=eval("("+data+")");  //解析json
             //alert(data.message)
                $.messager.show({
                  title:'消息',
                  msg:data.message,  //按key取值
                  timeout:1000,
                  showType:'slide',
                  height:120,
                 width:200
         });
     });
    

    推荐这种方式。
    效果图:
    在这里插入图片描述


    以上都是后台返回json数据给前台和前台解析json数据的一些总结,还有json数据的封装,工具类的使用等等,东西有点复杂有点多,挑选自己需要的地方即可。

    另外的一些常用的web开发json:

    Json–Java数据类型对照表(映射)表

    展开全文
  • Redis 存取 JSON 数据

    万次阅读 2018-12-26 11:22:45
    Redis 存取 JSON 数据 本文来自网络,本人稍加修改 关于下面rejson安装的修正!!! rejson安装我的按照下面的不行 我是下载rejson后,直接make,然后在src下发现有一个rejson.so,我直接用的这个 另外我启动的时候也...

    Redis 存取 JSON 数据

    本文来自网络,本人稍加修改

    关于下面rejson安装的修正!!!

    rejson安装我的按照下面的不行

    我是下载rejson后,直接make,然后在src下发现有一个rejson.so,我直接用的这个

    另外我启动的时候也不显示rejson信息,但是启动redis后可以存取json格式

    • 1. 简介
    • 2. 示例
      • 2.1 基础操作
      • 2.2 json 内部操作
    • 3. 安装
      • 3.1 安装流程
      • 3.2 详细安装过程
    • 4. 小结

    1. 简介

    Redis 本身有比较丰富的数据类型,例如 String、Hash、Set、List

    JSON 是我们常用的数据类型,当我们需要在 Redis 中保存 json 数据时是怎么存放的呢?

    一般是用 String 或者 Hash,但还是不太方便,无法灵活的操作 json 数据

    在 Redis 4.0 中,有一个重大改进:modules 模块系统,可以让我们开发新的功能,集成到 redis 中

    rejson 就是一个新的模块,为 redis 提供了 json 存储能力

    2. 示例

    2.1 基础操作

    127.0.0.1:6379> JSON.SET object . '{"foo": "bar", "ans": 42}'

    OK

    127.0.0.1:6379> JSON.GET object

    "{\"foo\":\"bar",\"ans\":42}"

    先看下第一条命令的含义:

    • JSON.SET 是json设置命令
    • object 是 key
    • . 是json文档的root,后面的一串是具体的 json 数据值

    第二条命令是获取 key 为 object 的json数据

    2.2 json 内部操作

    • 获取某字段的值

    127.0.0.1:6379> JSON.GET object .ans

    "42"

    命令中的 .ans 是目标路径,表示 root 下面的 ans

    • 设置某字段值

    127.0.0.1:6379> json.set object .name '"bill"'

    OK

    127.0.0.1:6379> json.get object

    "{\"foo\":\"bar\",\"ans\":42,\"hi\":\"hello\",\"name\":\"bill\"}"

    这个命令是在 root 下新增了一个字段 name,值为 bill

    也可以修改已有字段的值,用法相同

    • 删除字段

    127.0.0.1:6379> json.del object .name

    (integer) 1

    127.0.0.1:6379> json.get object

    "{\"foo\":\"bar\",\"ans\":42,\"hi\":\"hello\"}"

    这个命令使用 del 把 root 下的 name 字段删除了

    • 数字操作

    ans 字段是数字类型,值为 42,下面对其执行 +3 操作

    127.0.0.1:6379> json.numincrby object .ans 3

    "45"

    127.0.0.1:6379> json.get object

    "{\"foo\":\"bar\",\"ans\":45,\"hi\":\"hello\"}"

    还可以进行乘法操作

    127.0.0.1:6379> json.nummultby object .ans 2

    "90"

    127.0.0.1:6379> json.get object

    "{\"foo\":\"bar\",\"ans\":90,\"hi\":\"hello\"}"

    直接删除整个json串

    127.0.0.1:6379> json.get object

    "{\"foo\":\"bar\",\"ans\":90}"

    127.0.0.1:6379> json.del object

    (integer) 0

    127.0.0.1:6379> json.get object

    (nil)

    127.0.0.1:6379>

    还有很多其他操作命令,具体可以查看项目文档

    3. 安装

    因为使用了模块功能,所以需要 redis 4.0 以上版本

    3.1 安装流程

    1. 安装 redis 4.0
    2. 安装相关系统依赖
    3. 安装 rejson 模块
    4. redis 加载 rejson 模块

    3.2 详细安装过程

    安装 redis 4.0

    wget https://github.com/antirez/redis/archive/4.0-rc2.tar.gz

    tar xzf 4.0-rc2.tar.gz

    cd redis-4.0-rc2/

    make

    安装依赖

    yum groupinstall "Development Tools"

    (这是 centos 中的安装方法,ubuntu 可以使用这个命令 apt-get install build-essential )

    安装cmake

    # wget https://cmake.org/files/v3.8/cmake-3.8.0-rc3.tar.gz

    # tar -xzvf cmake-2.8.11.2.tar.gz

    # cd cmake-2.8.11.2

    # ./bootstrap

    # make

    # make install

    直接下载rejson 模块

    建议直接下载

    建议直接下载

    建议直接下载

    直接下载

    wget https://github.com/RedisJSON/RedisJSON/releases/download/v1.0.4/rejson.so

    启动 redis 时加载 rejson.so

    redis-server --loadmodule /path/to/module/rejson.so

    在启动信息中会看到 rejson 的相关信息

    ...

    <ReJSON> JSON data type for Redis

    ...

    安装完成,可以登录 redis 执行 json 命令了

    4. 小结

    rejson 让我们可以在 redis 中存储和操作 json 数据,非常方便

    而且通过体验 rejson 模块,还可以感受到 redis 模块系统的强大,以后将会出现各种基于redis的强大功能

    rejson 项目地址:

    https://redislabsmodules.github.io/rejson/

    展开全文
  • 假设你是用$.getJSON();方法获取JSON数据 $.getJSON(url,{"Action":...下面构建JSON数据: 构建JSON数据格式一(单个对象) {"Name":"Jime","Sex":"Boy","Birthday":"1991-12-8"} 获取方式: data.Name data.Sex

    假设你是用$.getJSON();方法获取JSON数据
    $.getJSON(url,{"Action":"getStudent"},function(data){});

    下面构建JSON数据:
    构建JSON数据格式一(单个对象)
    {"Name":"Jime","Sex":"Boy","Birthday":"1991-12-8"}
    获取方式:
    data.Name
    data.Sex

    构建JSON数据格式二(多个对象单一类型,匿名)
    [{"Name":"Jime","Sex":"Boy","Birthday":"1991-12-8"},{"Name":"Jary","Sex":"Boy","Birthday":"1990-12-8"}]
    获取方式:
    data[0].Name;

    构建JSON数据格式三(多个对象单一类型,命名)
    {"Stutent":[{"Name":"Jime","Sex":"Boy","Birthday":"1991-12-8"},{"Name":"Jary","Sex":"Boy","Birthday":"1990-12-8"}]}
    获取方式:
    data.Student[0].Name

    构建JSON数据格式四(多个对象多个类型)
    {"Stutent":[{"Name":"Jime","Sex":"Boy","Birthday":"1991-12-8"},{"Name":"Jary","Sex":"Boy","Birthday":"1990-12-8"}],"Class":
    {"Name":"三年级一班"}}
    获取方式:
    data.Student[0].Name
    data.Class.Name

    以上就是JSON数据的基本的格式了。
    值得注意的是JSON数据是区分大小写的,如Student和student是不一样的。
    顺便介绍一个JSON数据验证的网站JSON Editor: http://braincast.nl/samples/jsoneditor/


    展开全文
  • json数据解析,json数据转为java对象

    万次阅读 2017-04-24 22:11:50
    在Android开发过程中,经常需要与后台进行数据的交互,JSON作为一种轻量级的数据格式,经常被 ...下面是一组json字符串: String json="{"resultcode":"200","reason":"Return Successd!","result":{"province
  • pandas处理json数据

    万次阅读 多人点赞 2018-08-05 12:14:04
    今天展示一个利用pandas将json数据导入excel例子,主要利用的是pandas里的read_json函数将json数据转化为dataframe。先拿出我要处理的json字符串: strtext='[{"ttery":"min","issue"...
  • 动态的Json数据和静态的Json数据

    千次阅读 2016-10-08 17:24:59
    下面这张图就是动态的处理json数据,因为json数据是动态的,变化的,因此前端就不能写死,那么在解析数据时,就需要一个一个的遍历解析办法:JsonData dd03=JsonMapper.ToObject(www02.text)[“typeInfo”];...
  • PostgreSQL JSON数据类型

    万次阅读 2019-06-22 18:03:15
    PostgreSQL JSON数据类型 本文我们学习PostgreSQL JSON数据类型,同时也介绍JSON数据类型的基本操作和函数。 概述 JSON 代表 JavaScript Object Notation。JSON是开放的标准格式,由key-value对组成。JSON的主要用于...
  • 使用JSONObject解析JSON数据

    千次阅读 2019-07-18 11:29:51
    JSONObject是官方提供用来解析JSON数据的。 要解析JSON数据,首先我们得要有一个放有JSON数据的服务器地址,这里我自己配置了一个Web服务器,并且将JSON数据放在了上面。在浏览器输入JSON数据的服务器地址,出现的...
  • 接收Json数据

    千次阅读 2016-09-11 22:27:52
    在www.json.org...下面接着介绍用org.json构造和解析Json数据的方法示例。  用json-lib构造和解析Json数据的方法详解请参见我上一篇博文:Java构造和解析Json数据的两种方法详解一 一、介绍  org.j
  • 全网最简单的C# json数据解析无敌菜鸟教程十分钟搞定json数据解析废话先说一点,算了。直接进入正题吧。 用例子说话:JSON数据:string json: " { "Result": "A01", "List": [ { "name": "王艳", "sex": "F", ...
  • SpringMVC接收Json数据

    万次阅读 2018-08-17 17:19:01
    SpringMvc接收Json数据 前端页面 后台代码 效果 最后 SpringMvc接收Json数据 之前学习使用SSM框架来开发程序前端使用的是JSP,使用JSP虽然开发方便,但实在太不优雅了!还是通过Json来实现前后端的数据交互...
  • labelme的json数据转换成coco的json数据

    千次阅读 2019-03-13 15:52:57
    我的错主要是json保存的时候出错,TypeError: Object of type 'int32' is not JSON serializable,因为我labelme的json中point数据是整型,但是json好像不支持这种数据序列化,经过一番百度,结果是需要自己写一个...
  • json数据格式

    千次阅读 2019-05-18 17:33:54
    调用数据报错:Property keys must be ...//例如下面json数据,所有数据,都必须使用双引号 { "ret": true, "data":{ "info":[ {"id": "1", "name": "北京", "city":”北京市“}, {"id": "...
  • 使用JSON Schema验证JSON数据

    千次阅读 2015-11-24 14:58:44
    开发中经常需要验证JSON数据,比如从WSAPI返回的JSON数据是否符合预期,很多时候我们会自己写JSON解析和验证代码,其实有一个更简单的办法就是 使用JSON Schema, JSON Schema功能上与XML Schema类似,都是用来验证...
  • python中 将json数据转化为excel表格

    万次阅读 热门讨论 2018-08-07 20:12:23
    python中将json数据结构转化为excel表格 json数据(我的数据类型是:–列表嵌套字典) 先通过csv模块将json数据类型转化为csv格式 #!/usr/bin/python3 # -*- coding: utf-8 -*- import csv # 获取json...
  • js中 json读取解析json数据

    万次阅读 2018-11-13 18:53:40
    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本...同时,JSON是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON数据不须要任何特殊的 API 或工具包。  本...
  • Go处理json数据

    千次阅读 2018-12-07 08:44:32
    Go处理json数据   json数据格式 参见json数据格式说明。 如果没操作过json数据,建议先看下上面的文章,有助于理解本文后面的内容。 Go json包 Marshal():Go数据对象 -&gt; json数据 UnMarshal():Json...
  • json数据结构

    万次阅读 2018-08-11 21:38:40
    JSON即JavaScript Object Natation,它是一种轻量级的数据交换格式,非常适合服务器与JavaScript的交互。JSON易于人阅读和编写。同时也易于机器解析和生成。JSON采用完全独立语言的文本格式,但是也是用了类似于...
  • FreeMarker解析json数据

    千次阅读 2018-10-23 17:44:21
    简单的json格式数据在freemarker中可以直接解析,无需转为list。下面是简单示例: 1.嵌套的json解析 &lt;div class="atricle-text"&gt; &lt;!--assign指令用于在页面上定义一个变量,这儿...
  • springmvc返回json数据在IE浏览器中访问,会出现文件下载现象,这是因为IE10以下不支持application/json格式的Response响应,也就是说低于IE10版本一下的IE浏览器都需要使用text/html格式的Response响应;
  • Gson解析json数据

    万次阅读 2015-04-22 09:49:41
    json解析我们不陌生了,不过每次编写解析的代码时总是很头疼,一堆很...有人说jackJson解析速度快,大数据时FastJson要比Json效率高,小数据时反之。不过我还是偏爱谷歌的Json,即使效率可能偏低,但是稳定性肯定没得说
  • Java生成JSON数据

    万次阅读 2018-04-09 22:30:39
    后台开发由于业务需求,需要把多个第三方api返回的...这其中就涉及到用生成json数据的问题,首先给大家讲一下json的常见形式。 json的格式是:{key:value} 数组的格式是[ ]。[{key:value},{key:value}]这样就是一个...
  • JSON数据格式

    千次阅读 热门讨论 2013-12-11 21:07:28
    在学习AJAX的过程中,接触了一种新的数据格式——Json数据格式,一开始不是很明白,后来通过做一个“股票”的小程序,有了些了解,下面是我的总结,希望对大家有所帮助 一,概念 (1)一种轻量级的数据交换格式; (2)纯...
  • Json数据结构认识

    千次阅读 2016-10-31 16:20:21
    JSON是一种轻量级的,基于文本的数据交换格式,仅仅靠特定的字符格式就能很方便的传递字符信息,以下对JSON详细解读。 JSON: 全称:“JavaScript Object Notation”,(JavaScript 对象表示法),一种基于文本,...
  • scala中处理json数据

    千次阅读 2017-08-14 09:07:03
    1. Lift-json 2. Gson 3. Json4s 4. spray-json scala处理json可以调用JAVA常用json处理库来处理json 这里展示使用fastjson 和json-lib来处理 json-lib处理json 需要的包 import ...
  • perl 读取json 数据

    万次阅读 2012-08-28 17:15:21
    perl 读取json 数据 JSON (JavaScript Object Notation) 数据格式,官方的说法是“一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成“。 我的感觉是这个东东和XML之类的格式...
  • CEF生成JSON数据

    千次阅读 2016-04-12 13:19:12
    在“使用CEF的JSON解析功能”中介绍了使用CefParseJson方法,与之对应的还有一个CefWriteJson方法,可以用来生成JSON串(或二进制)……
  • JSON数据---JSONModel解析

    千次阅读 2016-06-23 21:01:23
    JSONModel 一个解析 JSON 数据的开源库,可以将 JSON 数据直接解析成自定义的 model . 使用 JSONModel 非常简单,只需要将你的 model 类继承自 JSONModel ,而同时 model 中的属性名又恰巧可以和 JSON 数据中的 key ...
  • c语言创建和解析json数据

    千次阅读 2018-10-31 16:00:17
    之前一篇有说到使用...下面我们使用json-glib库来对json数据进行创建和解析。 #include&lt;json-glib/json-glib.h&gt; #include&lt;stdio.h&gt; #include&lt;string.h&gt; int main() ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 381,881
精华内容 152,752
关键字:

下面哪个是json数据