zoukankan      html  css  js  c++  java
  • json对象与字符串互转

    javascript

    1 JSON.parse() 方法用于将一个 JSON 字符串转换为对象。
    JSON.parse(text[, reviver])

    text:必需, 一个有效的 JSON 字符串。
    reviver: 可选,一个转换结果的函数, 将为对象的每个成员调用此函数。

    var a = “{'a':1,'b':2}”
    
    经 JSON.parse(a)得到:
    
    {'a':1,'b':2}
    

    2 JSON.stringify() 方法用于将 JavaScript值(对象)转换为 JSON 字符串
    JSON.stringify(value[, replacer[, space]])

    var a={'a':1, 'b':2}
    
    经 JSON.stringify(a)得到:
    
    “{'a':1,'b':2}”
    

    python

    http://axiaoxin.com/article/77/

    在Python中最常用到的json处理函数通常是json.dumps()和json.loads(),他们和json.dump()和json.load()的区别在于后者是对一个类文件对象(如StringIO)进行写入/读取,而前者是对字符串进行读写,参数都一样。

    1 load()和loads() 字符串->Python的json对象
    有一个很有用的参数object_pairs_hook。loads后是无法保证json_data原始顺序的,如果想要保留原有的顺序,那么就需要用到object_pairs_hook。

    from collections import OrderedDict
    import json
    
    json_data = '{"q": 1, "r": 4, "e": 3, "w": 2}'
    json.loads(json_data)
    {u'e': 3, u'q': 1, u'r': 4, u'w': 2}
    
    json.loads(json_data, object_pairs_hook=OrderedDict)
    OrderedDict([(u'q', 1), (u'r', 4), (u'e', 3), (u'w', 2)])
    

    2 dump()和dumps() Python json对象->字符串

    skipkeys: 默认为False,作用是判断字典的key,如果key不是基本类型(str, unicode, int, long, float, bool, None),在dumps的时候就会报TypeError错。若为True,那么遇到不合法key的时候就会跳过。

    data = {1: 1, 'a': 'a', None: None, (0, 0): 'bad'}
    
    json.dumps(data, skipkeys=True)
    '{"a": "a", "1": 1, "null": null}'
    
    json.dumps(data)
    #TypeError: keys must be a string
    

    ensure_ascii: 默认为True,所有的非ascii字符在输出时都会被转义为uxxxx的序列,返回的对象是一个只由ascii字符组成的str类型,为False时不会进行转义输出,反回的对象是个unicode。(这个参数对包含中文的json输出时非常有用)

    data = {u'我': u'是', u'美': u'女'}
    
    json.dumps(data)
    '{"\u6211": "\u662f", "\u7f8e": "\u5973"}'
    
    json.dumps(data, ensure_ascii=False)
    u'{"u6211": "u662f", "u7f8e": "u5973"}'
    
    print json.dumps(data)
    {"u6211": "u662f", "u7f8e": "u5973"}
    
    print json.dumps(data, ensure_ascii=False)
    {"我": "是", "美": "女"}
    

    indent: 设置对json进行pretty-printed的缩进空格数

    print json.dumps(data, ensure_ascii=False, indent=0)
    {
    "我": "是",
    "美": "女"
    }
    
    print json.dumps(data, ensure_ascii=False, indent=4)
    {
        "我": "是",
        "美": "女"
    }
    

    separators: 默认值为(', ', ': '),第一个元素为item的分隔符,第二个是key和value的分隔符。separators=(',', ':')可以用来去掉json中的空格来压缩json

    print json.dumps(data, ensure_ascii=False, separators=(',', ':'))
    {"我":"是","美":"女"}
    
    print json.dumps(data, ensure_ascii=False)
    {"我": "是", "美": "女"}
    
    print json.dumps(data, ensure_ascii=False, separators=('+', '-'))
    {"我"-"是"+"美"-"女"}
    

    sort_key: 默认是False,即不对进行排序操作

    data = {'q': 1, 'w': 2, 'e': 3, 'r': 4}
    
    print json.dumps(data, ensure_ascii=False, sort_keys=False)
    {"q": 1, "r": 4, "e": 3, "w": 2}
    
    print json.dumps(data, ensure_ascii=False, sort_keys=True)
    {"e": 3, "q": 1, "r": 4, "w": 2}
    

    处理中文json时,要想不每次都给一堆重复的参数,可以用partial

    import json
    from functools import partial
    json_dumps = partial(json.dumps, ensure_ascii=False, sort_keys=True)
    

    中文测试

    json_dumps("呵呵")
    '"xe5x91xb5xe5x91xb5"'   # unicode
    
    json.dumps("呵呵")
    '"\u5475\u5475"'   # ascii
    
    json_dumps("呵呵").decode('utf-8')  # unicode -> utf-8
    u'"u5475u5475"'
    
    json.dumps("呵呵").decode('utf-8')  # ascii -> utf-8
    u'"\u5475\u5475"'
    
    print json_dumps("呵呵").decode('utf-8')
    "呵呵"
    
    print json.dumps("呵呵").decode('utf-8')      # 让大家苦恼的大概就是这个,因为她原本就不是unicode
    "u5475u5475"
    

    flask

    在Flask中直接return一个dumps的json字符串其实这样并不合理,因为这样返回的content-type是text/html,而json的content-type应该是application/json
    有两种方法在flask中返回正确json,一种是使用flask的jsonify,他会在dumps的时候自动为你加上content-type,或者手动的显式在response中指定mimetype

    from flask import jsonify
    
    @router
    def view():
        return jsonify(*arg, **kwargs)
        # or return Response(response=json_data, mimetype="application/json")
    

    用jsonify很省事,但是在有中文的时候就坑爹了,可以在app的配置中设置app.config['JSON_AS_ASCII'] = False来输出unicode

  • 相关阅读:
    hash_map和map的区别
    STL中map与hash_map容器的选择收藏
    ServletContextListener和ContextLoaderListener的区别
    解决Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile
    详解Tomcat线程池原理及参数释义
    Tomcat使用线程池配置高并发连接
    详解 Tomcat 的连接数与线程池
    ServletContextListener接口用法
    Spring Quartz定时任务如何获得ServletContext对象?
    如何在spring quartz类中拿到ServletContext
  • 原文地址:https://www.cnblogs.com/liujitao79/p/5282638.html
Copyright © 2011-2022 走看看