精华内容
下载资源
问答
  • 我们知道利用JSON模块可方便的将Python基本类型(dict、list等)数据永久的存储成文件,同时也...对象能够采取JSON存储解析是有很大意义的。例如机器学习中所有分类算法的训练过程中都存在大量的数据计算,如果...

    我们知道利用JSON模块可方便的将Python基本类型(dict、list等)数据永久的存储成文件,同时也可以通过自定义转换函数和继承JSON encode&decode的方法实现自定义类的存储。本文就在前文“ Python JSON模块”的基础上,实现python支持JSON存储的对象。

    对象能够采取JSON存储和解析是有很大意义的。例如机器学习中所有分类算法的训练过程中都存在大量的数据计算,如果每次启动分类都需要重新训练分类算法浪费资源且没有效率,如果能够将训练产生的分类算法对象保存起来,那么除非需要算法调优,以后只需载入即可。另一方面,对象能够进行JSON解析和存储也使得其可以在网络上传送,这在当下云计算、分布式数据处理中都有非凡的意义。

    为了实现自存储和解析,定义对象的关键操作有:

    0,将object_json.py copy至包中,定义对象的模块导入object_json:import object_json。

    1,__init__()函数要支持可变数量的函数调用,即要写成__init__(self, …, , **args)。如此定义对象才可以有除构造阶段需要初始化的属性之外的属性。

    2,对于对象构造阶段必须初始化的属性,__init__()函数中的形参必须与这些属性名称完全相同,如此才能通过字典‘key’: value对构造对象。

    3,定义一个属性‘__name__’–该对象实例的名称,利用inspect模块实现。‘__name__‘属性主要用于产生对象存储时默认的文件名称。

    4,定义jsonDumps()和jsonLoadTransfer()方法,通过objectLoadFromFile()完成对象JSON文件load和新对象创建。

    (i)jsonDumps()用于将对象转换成dict并通过json.dumps()将对象存储成json文件,若用户不指定文件名则以instancename.json为默认存储文件。由于JSON只支持python基本类型,因此若对象中有一些其他类型(如numpy matrix),则需将其转化成Python基本类型(如matrix.tolist()将matrix转换成list)。

    (ii)jsonLoadTransfer()用于完成数据格式的转换,将一些对象属性从基本类型转化成需要的类型(如mat(list)将类型从list转换成matrix),若对象只有Python基本类型则可以省略该方法。创建完整、可用对象过程是:obj = objectLoadFromFile()

    obj.jsonLoadTransfer()

    下面的代码就是支持自定义对象进行JSON存储和解析的object_json模块源码。import json

    import inspect

    import pdb

    def object2dict(obj):

    #convert object to a dict

    d = {'__class__':obj.__class__.__name__, '__module__':obj.__module__}

    d.update(obj.__dict__)

    return d

    def objectDumps2File(obj, jsonfile):

    objDict = object2dict(obj)

    with open(jsonfile, 'w') as f:

    f.write(json.dumps(objDict))

    def dict2object(d):

    '''convert dict to object, the dict will be changed'''

    if'__class__' in d:

    class_name = d.pop('__class__')

    module_name = d.pop('__module__')

    module = __import__(module_name)

    #print 'the module is:', module

    class_ = getattr(module,class_name)

    args = dict((key.encode('ascii'), value) for key, value in d.items()) #get args

    #print 'the atrribute:', repr(args)

    #pdb.set_trace()

    inst = class_(**args) #create new instance

    else:

    inst = d

    return inst

    def objectLoadFromFile(jsonFile):

    '''load json file and generate a new object instance whose __name__ filed

    will be 'inst' '''

    with open(jsonFile) as f:

    objectDict =json.load(f)

    obj = dict2object(objectDict)

    return obj

    #test function if __name__ == '__main__':

    class Person(object):

    def __init__(self,name,age, **args):

    obj_list = inspect.stack()[1][-2]

    self.__name__ = obj_list[0].split('=')[0].strip()#object instance name

    self.name = name

    self.age = age

    def __repr__(self):

    return 'Person Object name : %s , age : %d' % (self.name,self.age)

    def say(self):

    #d = inspect.stack()[1][-2]

    #print d[0].split('.')[0].strip()

    return self.__name__

    def jsonDumps(self, filename=None):

    '''essential transformation to Python basic type in order to

    store as json. dumps as objectname.json if filename missed '''

    if not filename:

    jsonfile = self.__name__+'.json'

    else: jsonfile = filename

    objectDumps2File(self, jsonfile)

    def jsonLoadTransfer(self):#TBD

    '''essential transformation to object required type,such as

    numpy matrix.call this function after newobject = objectLoadFromFile(jsonfile)'''

    pass

    p = Person('Aidan',22)

    #json.dumps(p)#error will be throwed

    #objectDumps2File(p,'Person.json')

    p.jsonDumps()

    p_l = objectLoadFromFile('p.json')

    print 'the decoded obj type: %s, obj:%s' % (type(p_l),repr(p_l))

    Python类有新旧两种,py 2.2 后类定义继承 object 的目的是使这个类成为 new style class, 没有继承 object 的为传统classic class(最终也会继承object)。

    类定义中如下两种方法:class Person(): class Person(object)

    其区别在于:

    若创建新的Person instanc test,则type(test)的输出分别为:

    inspect 模块提供了一系列自省函数,它可以获取模块,类,方法,函数,traceback,帧对象,代码对象的信息。常用的方法getmembers,ismodule,getcallargs,isclass等,更多详细信息参见:http://docs.python.org/library/inspect.html。

    展开全文
  • Android json解析

    2017-12-18 20:05:55
    JSON解析 无可奈何花落去,似曾相识燕归来 – 晏殊 JSON解析 JSON语法 本地json文件的解析 本地的json数据 解析实现方法注意 网络 json文件的解析 网络上的json数据 联网权限 注意 JSON文本的编写 源码下载 参考 ...

    JSON解析

    无可奈何花落去,似曾相识燕归来 – 晏殊

    JSON语法


    json语法是JavaScript对象表示法语法的子集

    • 数据在名称/值对中
    • 数据由逗号分隔
    • 花括号保持对象
    • 方括号保存数组

    JSON的值可以是:

    • 数字(整数或者浮点数)
    • 字符串(在双引号内)
    • 逻辑值(true 或 false)
    • 数组(使用方括号[]包围)
    • 对象( 使用花括号{}包围)
    • null

    JSON中有且只有两种结构:对象和数组。

    1、对象:对象在js中表示为“{}”括起来的内容,数据结构为
    {key:value,key:value,…}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为
    对象.key 获取属性值,这个属性值的类型可以是 数字、字符串、数组、对象几种。

    2、数组:数组在js中是中括号“[]”括起来的内容,数据结构为
    [“java”,”javascript”,”vb”,…],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是 数字、字符串、数组、对象几种。

    本地json文件的解析

    本地的json数据

    我们先解析本地的json文件 ,之后再解析网络的json文件
    程序要解析的数据都放在项目的assets目录下

    json文件位置
    我们将新建三个json文件,来依次解析不同的数据类型
    下面就三个json文件的源码
    注意三个json文件的不同

    • get_data1.json
    {"name":"baoqiang", "age":"18", "address":"ganzhou"}
       
    • 1
    • get_data2.json
    [
      {"id":1,"ide":"Eclipse","name":"java"},
      {"id":2,"ide":"XCode","name":"Swift"},
      {"id":3,"ide":"Visual Studio","name":"C##"}
    ]
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • get_data3.json
    {"name":"baoqiang", "age":"18", "address":"ganzhou",
      "languages":[
        {"id":1,"ide":"Eclipse","name":"java"},
        {"id":2,"ide":"XCode","name":"Swift"},
        {"id":3,"ide":"Visual Studio","name":"C##"}
      ] 
    }
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    解析实现方法

    一. 解析get_data1.json的数据,代码直接放在onCreate方法下执行

     try {
                //InputStreamReader 将字节输入流转换为字符流
                InputStreamReader isr = new InputStreamReader(getAssets().open("get_data1.json"), "UTF-8");
                //包装字符流,将字符流放入缓存里
                BufferedReader br = new BufferedReader(isr);
                String line;
                //StringBuilder和StringBuffer功能类似,存储字符串
                StringBuilder builder = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    //append 被选元素的结尾(仍然在内部)插入指定内容,缓存的内容依次存放到builder中
                    builder.append(line);
                }
                br.close();
                isr.close();
                //builder.toString()返回表示此序列中数据的字符串
                JSONObject root = new JSONObject(builder.toString());
                System.out.println("name=  " + root.getString("name") +
                        ";age=  " + root.getInt("age") +
                        ";address=  " + root.getString("address"));
            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    结果
    get_data.json

    二. 解析get_data2.json的数据

    try {
                InputStreamReader isr = new InputStreamReader(getAssets().open("get_data2.json"), "UTF-8");
                BufferedReader br = new BufferedReader(isr);
                String line;
                StringBuilder builder = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    builder.append(line);
                }
                br.close();
                isr.close();
                JSONArray array = new JSONArray(builder.toString());
                for (int i = 0; i < array.length(); i++) {
                    JSONObject lan = array.getJSONObject(i);
                    System.out.println("-----------------");
                    System.out.println("id= " + lan.getInt("id"));
                    System.out.println("ide= " + lan.getString("ide"));
                    System.out.println("name= " + lan.getString("name"));
                }
            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    结果
    get_data2.json.

    三.解析get_data3.json数据

    try {
                InputStreamReader isr = new InputStreamReader(getAssets().open("get_data3.json"), "UTF-8");
                BufferedReader br = new BufferedReader(isr);
                String line;
                StringBuilder builder = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    builder.append(line);
                }
                br.close();
                isr.close();
                JSONObject root = new JSONObject(builder.toString());
                System.out.println("name= " + root.getString("name") +
                        " age= " + root.getInt("age") +
                        " address= " + root.getString("address"));
                //读取多个数据
                JSONArray array = root.getJSONArray("languages");
                for (int i = 0; i < array.length(); i++) {
                    JSONObject lan = array.getJSONObject(i);
                    System.out.println("-----------------");
                    System.out.println("id= " + lan.getInt("id"));
                    System.out.println("name= " + lan.getString("name"));
                    System.out.println("ide= " + lan.getString("ide"));
                }
            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    结果
    get_data3.json

    注意

    lan.getInt(“id”)和getJSONObject();还可以用lan.optInt(“id”)和optJSONObject()表示,功能相同,返回值不同,,get会有null值异常抛出
    如果解析数组和对象类型数不正确,则会报错
    System.err: org.json.JSONException …….type org.json.JSONObject cannot be converted to JSONArray
    System.err: at org.json.JSON.typeMismatch(JSON.java:111)

    网络 json文件的解析

    网络上的json数据

    网络服务器选用Tomcat服务器
    我们把get_data3.json文件放在C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\ROOT目录下,并开启Tomcat服务器
    大可不必用eclipse建立动态网站来发布文件
    下图是开启后从浏览器查看发布的数据
    网络json数据

    • get_data3.json
    {"name":"baoqiang", "age":"18", "address":"ganzhou",
      "languages":[
        {"id":1,"ide":"Eclipse","name":"java"},
        {"id":2,"ide":"XCode","name":"Swift"},
        {"id":3,"ide":"Visual Studio","name":"C##"}
      ] 
    }
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    联网权限

    <uses-permission android:name="android.permission.INTERNET"/>
       
    • 1

    代码

    注意

    联网需要开子线程,如果要更新UI,还需要在子线程中用runOnUiThread()或者Handler来处理

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            System.out.println("开始");
            new Thread() {
                @Override
                public void run() {
                    try {
                        //注意填写自己的IPv4路径,不能用localhost
                        String path = "http://192.168.1.44:8080/get_data3.json";
                        URL url = new URL(path);
                        System.out.println(path);
                        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                        conn.setRequestMethod("GET");
                        conn.setConnectTimeout(5000);
                        if (conn.getResponseCode() == 200) {
                            System.out.println("连接成功");
                            InputStream in = conn.getInputStream();
                            InputStreamReader isr = new InputStreamReader(in);
                            //InputStreamReader isr = new InputStreamReader(getAssets().open("get_data.json"),"UTF-8");
                            BufferedReader br = new BufferedReader(isr);
                            String line;
                            //StringBuilder 缓存区 StringBuffer
                            StringBuilder builder = new StringBuilder();
                            while ((line = br.readLine()) != null) {
                                builder.append(line);
                            }
                            br.close();
                            isr.close();
                            JSONObject root = new JSONObject(builder.toString());
                            System.out.println("name= " + root.getString("name") +
                                    " age= " + root.getInt("age") +
                                    " address= " + root.getString("address"));
                            //读取多个数据
                            JSONArray array = root.getJSONArray("languages");
                            for (int i = 0; i < array.length(); i++) {
                                JSONObject lan = array.getJSONObject(i);
                                System.out.println("-----------------");
                                System.out.println("id= " + lan.getInt("id"));
                                System.out.println("name= " + lan.getString("name"));
                                System.out.println("ide= " + lan.getString("ide"));
                            }
                        } else {
                            System.out.println("连接失败");
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }.start();
        }
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    结果
    联网读取json数据

    JSON文本的编写

    需要编写的格式文件

    {"name":"baoqiang", "age":"18", "address":"ganzhou",
      "languages":[
        {"id":1,"ide":"Eclipse","name":"java"},
        {"id":2,"ide":"XCode","name":"Swift"},
        {"id":3,"ide":"Visual Studio","name":"C##"}
      ]
    }
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    编写代码

     try {
                JSONObject root = new JSONObject();
                root.put("name", "baoqiang");
                root.put("age", "12");
                root.put("adress", "guanzhou");
                /**
                 * languages三行值
                 */
                JSONObject lan1 = new JSONObject();
                lan1.put("id", "1");
                lan1.put("ide", "Eclipse");
                lan1.put("name", "java");
    
                JSONObject lan2 = new JSONObject();
                lan2.put("id", "2");
                lan2.put("ide", "Xcode");
                lan2.put("name", "swift");
    
                JSONObject lan3 = new JSONObject();
                lan3.put("id", "3");
                lan3.put("ide", "Studio");
                lan3.put("name", "C#");
    
                JSONArray array = new JSONArray();
                array.put(lan1);
                array.put(lan2);
                array.put(lan3);
    
                root.put("languages", array);
                System.out.println(root.toString());
    
            } catch (JSONException e) {
                e.printStackTrace();
            }
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    结果

    JSON文本编写

    源码下载

    json本地解析-源码:https://github.com/PengHongfu/Json_Local.git
    json网络解析-源码:https://github.com/PengHongfu/Json_net.git

    参考

    http://blog.isming.me/blog/2014/06/04/parse-json-in-android/



    展开全文
  • 解析复杂JSON数据

    2019-09-19 16:20:22
    解析复杂的JSON数据 例: {“result”: [ {“score”:0.701022,“root”:“人物-人物特写”,“keyword”:“美女”,“baike_info”: {“baike_url”:“http://baike.baidu.com/item/%E7%BE%8E%E5%A5%B3/109596” ,...

    解析复杂的JSON数据

    例:
    {“result”:
    [
    {“score”:0.701022,“root”:“人物-人物特写”,“keyword”:“美女”,“baike_info”:
    {“baike_url”:“http://baike.baidu.com/item/%E7%BE%8E%E5%A5%B3/109596”
    ,“image_url”:“http://imgsrc.baidu.com/baike/pic/item/91529822720”
    + “e0cf3acdfc0280046f21fbe09aa3d.jpg”,“description”:“美女是一个汉语词汇,拼音是:měi nǚ,释义:容貌姣好、仪态优雅的女子。中国古代关于美女的形容词和诗词歌赋众多,形成了丰富的美学资料。
    }
    },
    {“score”:0.516248,“root”:“商品-穿戴”,“keyword”:“上衣”,“baike_info”: {“baike_url”:“http://baike.baidu.com/item/%E4%B8%8A%E8%A1%A3/10200813”,“image_url”:“http://imgsrc.baidu.com/baike/pic/item/63d9f2d3572c11df054fe42b6d2762d0f703c218.jpg”,“description”:”[词目]上衣[拼音]shàng yī[英文] Tops;Coat;Jacket[解释]1.外衣。2.上身穿的衣服。3.上衣的分类有学生装、军便装、夹克衫、两用衫、T恤等等类型。穿于人体上身的常用服装。一般由领、袖、衣身、袋4部分构成,并由此4部分的造型变化形成不同款式。4.传统服饰。外衣。此称始于汉。《论语·乡党》\u201c当暑袗絺绤,必表而出之\u201d,何晏集解引孔安国曰:\u201c暑则单服。絺绤,葛也。"
    }
    },{“score”:0.329718,“root”:“商品-服装”,“keyword”:“吊带睡衣”,“baike_info”:
    {}
    },{“score”:0.029778,“root”:“人物-人物特写”,“keyword”:“人物特写”,“baike_info”:
    {}
    }
    ],
    “log_id”:3870743702425521491,“result_num”:5}
    在这里插入图片描述
    这是一个json串 我用不同的颜色将他分成多层
    简单的json串我们可以直接通过 getString(字段名)来直接获取对应数据;
    n层的串就相当于一个n层的k-v对我们不能直接用getString()取出来 因为里面每一层都是一个 n-1层的json串
    需要先利用 getJSONArray(“字段名”’);将里层的所有数据放到一个JSONObject中
    然后再利用getString(字段名)获取数据
    如果数据在下一层 则继续利用 getJSONArray 将下一层的json提取出来
    然后再利用 getString(字段名)获取。
    比如 我们要取上面json串中的 “score”:0.701022.

    //该json变量名为 res  假定所有v都是字符串
    
    JSONArray jsonArray = res.getJSONArray("result");
    //拆最外层 将最外层数据存储到 jsonArray 中
    
    JSONObject jsonObject = jsonArray.getJSONObject(0);
    //我们发现该json串最外层的第一个字段值是一个数组,我们通过getJSONArray把这个数组放到JSONArray中
    //然后我们利用getJSONObject(0)将这个数组中的 0就是下标的意思 代表这个数组中第一个json串。
    String score = jsonObject .getString("score");
    //这样我们就已经将0.7201022放到score中了
    
    // 如果我们想要取上面baike_url对应的v我们需要继续拆json串
    JSONObject jsonObject2 = jsonObject.getJSONObject("baike_info");
    /*这样我们就相当于将 {“baike_url”:“http://baike.baidu.com/item/%E7%BE%8E%E5%A5%B3/109596”
    “image_url”:“http://imgsrc.baidu.com/baike/pic/item/91529822720”
    + “e0cf3acdfc0280046f21fbe09aa3d.jpg”,“description”:“美女是一个汉语词汇,拼音是:měi nǚ,释义:容貌姣好、仪态优雅的女子。中国古代关于美女的形容词和诗词歌赋众多,形成了丰富的美学资料。  
    }  这些数据以一个心得json串存放到了jsonObject2中 
    */
    String baike_url = jsonObject2.getString("baike_url");
    //这样我们就获取到了第三层的数据  如果想要得到第四层或者等过层的数据只需要一直jsonArray.getJSONObject(下一个json串名) 直到将你要获取的字段所咋的层解析到一个jsonObject中 然后 通过 getString()方法获取指定字段数据就好了
    
    
    
    
    /*
    *注: JSONArray  中存储了多个json串  并列关系+嵌套关系
    *     JSONObject 中存储了一个json串  嵌套关系
    *     获取下一个json串都是 通过getJSONObject()方法 但是参数 不同  
    *     JSONArray参数是json串在这一组数据中的下标从零开始
    *     JSONObject参数是json串的字段名通过 k获取
    */
    
    展开全文
  • 后台返回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数据类型对照表(映射)表

    展开全文
  • // 调用 JSON 库的内容,获取到解析的对象 JSONObject jsonObject = JSON.parseObject(str); // 获取到 indexes 数组 JSONArray jsonArray = jsonObject.getJSONArray("indexes"); for (Object o : jsonArray)...
  • Json解析

    2018-08-30 14:17:33
    它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析...
  • Android网络数据JSON解析使用总结

    万次阅读 多人点赞 2016-11-16 13:50:51
    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。
  • Android网络传输数据Json解析的基本认识
  • 由于之前工作上需要在oracle中做split功能以及json格分解。然后经过一番google和优化整合,最后整理到一个存储过程包中,易于管理,代码如下: 1、包定义: CREATE OR REPLACE PACKAGE PKG_COMMON IS -- ...
  • 首先说一下Json数据的最基本的特点,Json数据是一系列的键值对的集合,和XML数据来比,Json数据的体积更加小,传输效率高,易解析,不过可读性不高;  因为这次要从服务器端得到Json数据,并且通过解析之后把解析...
  • JSON解析

    2013-08-09 21:48:30
    前面我们学习过了一种简单的数据存储语言XML,以其自身的优点在业界得到广泛的支持。今天,我们来看看另一种轻量级的数据存储格式--JSON 一:JSON到底是什么?...JSON解析正是将字符串变为我们需要的数据的...
  • JSON格式数据解析

    2018-11-12 17:41:27
    1 简介 1.1 概述 JSON(JavaScript Object Notation,JavaScript对象表示法...JSON解析器和JSON库支持许多不同的编程语言; 1.2 特点 序号 特性 1 纯文本,自我描述,层级结构 2 通...
  • 主要需求: 针对嵌套多层json,可以指定解析到的层级,并返回完整的解析后信息。 目前没在工具类中找到类似的函数故自己实现了,如果大神知道的话请告知下. 1.目前默认认定数组为最底层结构不做解析,以数据返回。 2....
  • 使用Gson解析json数据

    千次阅读 2016-11-25 15:22:12
    Gson解析系列阅读Gson使用指南使用Gson解析复杂的JSON数据使用Gson解析json数据Gson全解析搞定Gson泛型封装简单新闻客户端jsonJson 全称 JavaScript Object Natation ,用来描述数据结构,它是基于纯文本的数据格式...
  • 项目背景:assets包下有个json压缩文件,要求对该文件进行解压,再对解压后的json文件进行解析,并最终将数据存入数据库中。 解压工具类: public class ZipUtils { public static final String TAG = ZipUtils...
  • JSON数据解析

    千次阅读 2012-10-30 15:23:20
    JSON的定义:  一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),...1.JSON和XML的数据可读
  • 一、JSON解析 我这里指的解析是:JSON和JavaObject之间的序列化和反序列化。 如果你的项目进行了前后端分离,那你一定使用过JSON进行数据交互,那在后端就一定会涉及到对Json数据的解析,虽然使用SpringMvc加上@...
  • 3.JSON数据解析

    2020-09-25 11:15:21
    JSON:(JavaScript Object Notation,...它独立于语言和平台,JSON解析器和JSON库支持不同的编程语言。JSON具有自我描述性,很容易理解。目前大多数接口返回的数据格式为JSON,因此进行接口测试必须掌握JSON。
  • 什么是json? 懵逼回答:【参考菜鸟教程】   a.JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)   b.JSON 是轻量级的文本数据交换格式...JSON 解析器和 JSON 库支持许多不同的编程语言。 目前...
  • ios json数据解析

    万次阅读 2014-05-16 15:48:37
    刚刚下午那会 弄了个 解析 xml demo的小例子,本想着json也挺复杂 弄还是 不弄,但是简单的看了下 发现挺简单,这个时候就犹豫了,要不写到博客上来 ? 考虑了很久,还是写上来吧,毕竟json用得太多了,而且算是...
  • DOM SAX JSON数据解析

    2016-04-27 19:49:08
     最常用的一种xml解析方式。  xml基本的结点类型:  1.Document 代表整个xml文档。  2.Element 最主要的处理对象。  3.Node DOM基本的数据类型。  4.Attr 元素的属性  5.Text Element或者Attr的...
  • Android json数据解析

    千次阅读 2014-09-12 17:41:53
    今天很高兴和大家一起学习Android的JSON数据解析,可能对于学习安卓的朋友都知道JSON数据解析方面已经很普遍了.所以也是我们必定要了解的知识 ,下面让我们了解一下JSON的发展历程. XML——这种用于表示客户端与...
  • hive 存储解析,处理json数据 hive 处理json数据总体来说有两个方向的路走 将json以字符串的方式整个入Hive表,然后通过使用UDF函数解析已经导入到hive中的数据,比如使用LATERAL VIEW json_tuple的方法,获取所...
  • 常用数据格式xml和json解析

    千次阅读 2017-04-21 17:43:45
    jsoupxml格式数据原生解析有pull和sax两种方式,主要是有两个不同的工厂类XmlPullParserFactory和SaxParserFactory。 介绍一种框架解析jsoup。“`java /* * 1.使用 Jsoup 载入 Html 数据功能 * 数据内容可以是...
  • Android之JSON格式数据解析

    万次阅读 多人点赞 2015-01-01 12:45:52
    JSON:JavaScript 对象表示法(JavaScript Object Notation)。...Android平台自带了JSON解析的相关API,可以将文件、输入流中的数据转化为JSON对象,然后从对象中获取JSON保存数据内容。 Android的JSON
  • json学习json解析demo

    千次阅读 2012-07-19 09:40:08
    JSON的定义:  一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持)...1.JSON和XML的数据可读性基本相同
  • 首先说一下Json数据的最基本的特点,Json数据是一系列的键值对的集合,和XML数据来比,Json数据的体积更加小,传输效率高,易解析,不过可读性不高;  因为这次要从服务器端得到Json数据,并且通过解析之后把...
  • 一、简介利用递归的方式反射解析到bean里面二、详细代码1、 Json格式例如服务器指定规定json格式为:{ "code": "……" , // 返回代号,预留字段,默认返回null "type":"ERROR", // 返回类型,表示操作是成功或失败 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 95,162
精华内容 38,064
关键字:

json解析存储指定数据