一、说明

1.1 背景说明

json对象与string相互转换,这东西想写了很多次,但总觉得网上教程比较成熟,所以之前每次都放弃了。但今天又被string转json对象折腾了半天,实在受不了,所以还是要写一写。

2.1 问题明确

首先要明确,python里有json这个库,但并没有json这个类,所以所谓的json对象本质上就是一个dict;而json这个库,用于实现dict到string、string到dict的互转。

更具体一点,json对象(dict)转string用json.dumps(),string转json对象(dict)用json.loads()。(另外dump()是json输出到文件,load()是从文件载入成json。)

对于哪个转哪个用哪个常弄混的问题,可以这么理解:以json为参照点,loads是向载入的动作靠向json所以是string转成json对象,所以dumps是从取出的动作远离json所以是json对象转成string。

二、json对象(dict)转string

2.1 简单地直接转换----使用json.dumps()

import json

# 变量为dict类型,亦即所谓的json对象
json_dict = {
"username": "root",
"password": "toor"
} # 变量为str类形,json对象转成的字符串
# 值为'{"username": "root", "password": "toor"}'
json_str = json.dumps(json_dict) # 注意如果将json_dict和json_str都使用print()直接打印出来,看不出什么区别,因为字符串类型变量print出来后最外层的引号会被脱掉
# 唯一的区别是,打印出来的json_dict键值都使用单引号,而json_str内层使用双引号,外层使用单引号

2.2 更美观地输出

json对象或者说是dict类型变量是可以直接使用print()函数打印的,但只是那种所有key-value都打印在一行的形式。使用json.dumps()我们可以使用输出成缩进形式。

import json

# 变量为dict类型,亦即所谓的json对象
json_dict = {
"username": "root",
"password": "toor"
} # 变量为str类形,json对象转成的字符串
# 值为'{"username": "root", "password": "toor"}'
# json_str = json.dumps(json_dict) # indent是缩进空格数,这里4表示使用4空格缩进
# 值为'{\n "username": "root", \n"password": "toor"\n}'
json_str = json.dumps(json_dict, indent=4)
print(json_str)

三、string转json对象(dict)

常规的string----指最外层是单引号,内层键值是双引号,且最后一对键值之后没有逗号的字符串。如'{"username": "root", "password": "toor"}'。

特殊的string----指最外层是双引号,内层键值是单引号,或者最一对键值之后有逗号的字符串。如"{'username': 'root', 'password': 'toor'}"或'{"username": "root", "password": "toor",}'。

如下图可以看到,对于特殊字符串如果强行使用json.loads()要将其转换成json对象,那最外层双引号或最后的逗号都会触发报错:ValueError: Expecting property name: line x column xx (char xx)

3.1 常规的string转json对象(dict)----使用json.loads()

import json

# 变量为str类形,待json对象的常规字符串
json_str = '{"username": "root", "password": "toor"}' # 变量为dict类型,亦即所谓的json对象
# {'username': 'root', 'password': 'toor'}
json_dict = json.loads(json_str)

3.2 特殊的string转json对象(dict)----使用ast.literal_eval()

import ast

# 变量为str类形,待json对象的特殊字符串
json_str = "{'username': 'root', 'password': 'toor'}"
# json_str = '{"username": "root", "password": "toor",}'
# json_str = "{'username': 'root', 'password': 'toor',}" # 变量为dict类型,亦即所谓的json对象
# {'username': 'root', 'password': 'toor'}
json_dict = ast.literal_eval(json_str)

参考:

https://stackoverflow.com/questions/25707558/json-valueerror-expecting-property-name-line-1-column-2-char-1/36599122

https://stackoverflow.com/questions/3733554/how-to-format-dict-string-outputs-nicely

json对象与string相互转换教程的更多相关文章

  1. JSON对象与XML相互转换工具类

    依赖jar <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId ...

  2. json对象与字符串相互转换

    JSON 语法 JSON 语法规则 在 JS 语言中,一切都是对象.因此,任何支持的类型都可以通过 JSON 来表示,例如字符串.数字.对象.数组等.但是对象和数组是比较特殊且常用的两种类型: 对象表 ...

  3. JSON对象和String之间的互转及处理

    如题,本文列举了一些在web前端开发中常用的转换及处理方式.使用JSON而不是字符串,主要是为了方便处理. JSON:JavaScript 对象表示法(JavaScript Object Notati ...

  4. js JSON对象与字符串相互转换

    从服务器接收到数据一般是字符串的形式.如果是JSON格式的字符串,就需要先将其转换成JSON对象.JSON对象在浏览器输出为objcet,我们看不到具体的数据.所以将JSON对象转换成字符串. 下面将 ...

  5. JSON对象和string的相互转换

    JSON.stringify(obj) 将JSON转为字符串. JSON.parse(string) 将字符串转为JSON格式.

  6. Js对象转String的函数 和 JSON转String

    js对象转string的函数 function obj2str(o){ var r = []; if(typeof o =="string") return "" ...

  7. dynamic获取类型可变的json对象

    使用dynamic获取类型可变的json对象 Dictionary<string, object> dict = new Dictionary<string, object>( ...

  8. JAVA中如何将一个json形式的字符串转为json对象或对象列表

    import java.util.*; import java.text.SimpleDateFormat; import org.json.JSONObject; import org.json.J ...

  9. C# 反射(GetType) 获取动态Json对象属性值的方法

    之前在开发一个程序,希望能够通过属性名称读取出属性值,但是由于那时候不熟悉反射,所以并没有找到合适的方法,做了不少的重复性工作啊! 然后今天我再上网找了找,被我找到了,跟大家分享一下. 其实原理并不复 ...

随机推荐

  1. C++贪心算法实现活动安排问题

    问题描述: 设有n个活动的集合E={1,2,…,n},其中,每个活动都要求使用同一资源,而在同一时间内只有一个活动能使用这一资源.每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且s ...

  2. React路由安装使用和多种方式传参

    安装路由 npm i react-router-dom -S 引入路由 import { BowserRouter as Router, Route, Switch, ... } from " ...

  3. 【开发工具】- Idea常用快捷键

    快捷键 Ctrl + shift + F 全局搜索 Ctrl + F 搜索 Ctrl + Z 后退 Ctrl + shift + Z 前进 Ctrl + Shift+E 最近更改的文件 Ctrl + ...

  4. 获取Object对象属性的方法,Reflect.ownKeys, Object.getOwnPropertyNames,Object.getOwnPropertySymbols,Object.keys,for in

    let triangle={ a:1, b:2, c:3 } function coloTriangle(){ this.color='red'; } coloTriangle.prototype=t ...

  5. 个人项目 python实现

    一.  github地址:https://github.com/zjh1234562/WC 二 . PSP表格 PSP2.1 Personal Software Process Stages 预估耗时 ...

  6. VUE+ElementUI 搭建后台项目(一)

    前言 之前有些过移动端的项目搭建的文章,感觉不写个pc端管理系统老感觉少了点什么,最近公司项目比较多,恰巧要做一个申报系统的后台管理系统,鉴于对vue技术栈比较熟悉,所以考虑还是使用vue技术栈来做: ...

  7. 搜索引擎框架之ElasticSearch基础详解(非原创)

    文章大纲 一.搜索引擎框架基础介绍二.ElasticSearch的简介三.ElasticSearch安装(Windows版本)四.ElasticSearch操作客户端工具--Kibana五.ES的常用 ...

  8. oracle查看表空间的真实使用情况

    --查看表空间的真实使用情况 set linesize 500 pagesize 500 col tablespace_name format a25 col TP_REAL_GB format a1 ...

  9. LDA-作为线性判别 分类器 推导

    LDA, 即 Linear Discriminant Analysis, 中文翻译为, 线性判别分析. 比较有趣的一点是:LDA 既可以直接用作分类算法, 也可作为特征降维的方法. 给人感觉, 这是将 ...

  10. AIX运维常用命令

    目前传统的磁盘管理仍有不足:如果下Unix系统中的存储容量需要扩展,文件系统就必须停止运行,然后通过重构分区的手段来进行分区和文件系统的扩容.一般采用的方法是先备份该文件系统并删除其所在的分区,然后重 ...