非JSON字符串如何转对象:实用方法与代码示例
在开发中,我们常遇到需要将字符串转换为对象(或字典)的场景,JSON凭借其简洁性和通用性,成为数据交换的主流格式,但实际场景中,字符串可能并非标准JSON格式(如XML、CSV、URL查询参数、自定义分隔符字符串等),本文将详细介绍如何将这些非JSON字符串转换为对象,涵盖常见场景的解决方案及代码示例。
什么是非JSON字符串?
非JSON字符串是指不符合JSON(JavaScript Object Notation)格式规范的字符串,JSON格式要求严格,
- 必须使用双引号()包裹键和字符串值(单引号非法);
- 值只能是对象()、数组(
[])、字符串、数字、布尔值(true/false)或null; - 不能有注释、尾随逗号等。
常见的非JSON字符串包括:
- XML格式(如
<user><name>张三</name><age>25</age></user>); - CSV格式(如
name,age\n张三,25); - URL查询参数(如
name=张三&age=25); - 自定义分隔符字符串(如
name:张三;age:25); - 其他格式(如YAML、INI等)。
非JSON字符串转对象的通用方法
无论哪种非JSON字符串,核心思路是通过解析器将字符串结构化,再映射为对象,具体方法取决于字符串的格式类型,以下是常见场景的解决方案。
XML字符串转对象
XML(eXtensible Markup Language)是一种标记语言,常用于配置文件或数据交换,需通过XML解析器将其转换为对象。
方法:使用xmltodict库(Python)
xmltodict是Python中常用的XML转字典的库,安装命令:pip install xmltodict。
示例代码:
import xmltodict
xml_str = """
<user>
<name>张三</name>
<age>25</age>
<hobbies>
<hobby>阅读</hobby>
<hobby>编程</hobby>
</hobbies>
</user>
"""
# XML字符串转字典
obj = xmltodict.parse(xml_str)
print(obj)
# 输出:OrderedDict([
# ('user', OrderedDict([
# ('name', '张三'),
# ('age', '25'),
# ('hobbies', OrderedDict([
# ('hobby', ['阅读', '编程'])
# ]))
# ]))
# ])
# 可选:转换为普通字典(OrderedDict转dict)
import json
obj_dict = json.loads(json.dumps(obj))
print(obj_dict)
# 输出:{
# 'user': {
# 'name': '张三',
# 'age': '25',
# 'hobbies': {
# 'hobby': ['阅读', '编程']
# }
# }
# }
其他语言示例(JavaScript)
浏览器环境可直接使用DOMParser:
const xmlStr = `<user><name>张三</name><age>25</age></user>`;
const parser = new DOMParser();
const xmlDoc = parser.parseFromString(xmlStr, "text/xml");
const userObj = {
name: xmlDoc.getElementsByTagName("name")[0].childNodes[0].nodeValue,
age: parseInt(xmlDoc.getElementsByTagName("age")[0].childNodes[0].nodeValue)
};
console.log(userObj); // { name: '张三', age: 25 }
CSV字符串转对象
CSV(Comma-Separated Values)是一种以逗号分隔值的格式,常用于表格数据存储,需通过CSV解析器将其转换为对象列表。
方法:使用csv模块(Python标准库)
示例代码:
import csv
from io import StringIO
csv_str = """name,age,city
张三,25,北京
李四,30,上海
王五,28,广州
"""
# 使用StringIO将字符串转为文件对象
csv_file = StringIO(csv_str)
# 读取CSV内容(DictReader直接转为字典列表)
reader = csv.DictReader(csv_file)
obj_list = [row for row in reader]
print(obj_list)
# 输出:[
# {'name': '张三', 'age': '25', 'city': '北京'},
# {'name': '李四', 'age': '30', 'city': '上海'},
# {'name': '王五', 'age': '28', 'city': '广州'}
# ]
其他语言示例(JavaScript)
使用papaparse库(需安装:npm install papaparse):
const Papa = require('papaparse');
const csvStr = `name,age,city
张三,25,北京
李四,30,上海`;
const result = Papa.parse(csvStr, {
header: true, // 第一行作为键名
dynamicTyping: true // 自动转换数字类型
});
console.log(result.data); // [ { name: '张三', age: 25, city: '北京' }, { name: '李四', age: 30, city: '上海' } ]
URL查询参数字符串转对象
URL查询参数(如name=张三&age=25&hobbies=阅读,编程)需通过URL解析器转换为键值对对象。
方法:使用urllib.parse(Python)或URLSearchParams(JavaScript)
Python示例:
from urllib.parse import parse_qs, parse_qsl
query_str = "name=张三&age=25&hobbies=阅读,编程"
# parse_qs:返回字典,值为列表(适合多值参数)
obj = parse_qs(query_str)
print(obj)
# 输出:{
# 'name': ['张三'],
# 'age': ['25'],
# 'hobbies': ['阅读,编程']
# }
# parse_qsl:返回键值对列表,再手动转字典
obj_list = parse_qsl(query_str, encoding='utf-8')
obj_dict = dict(obj_list)
print(obj_dict)
# 输出:{'name': '张三', 'age': '25', 'hobbies': '阅读,编程'}
JavaScript示例(浏览器/Node.js):
// 浏览器环境
const queryStr = "name=张三&age=25&hobbies=阅读,编程";
const urlParams = new URLSearchParams(queryStr);
const obj = {};
for (const [key, value] of urlParams.entries()) {
obj[key] = value;
}
console.log(obj); // { name: '张三', age: '25', hobbies: '阅读,编程' }
// Node.js环境(需安装querystring:npm install querystring)
const querystring = require('querystring');
const objNode = querystring.parse(queryStr);
console.log(objNode); // { name: '张三', age: '25', hobbies: '阅读,编程' }
自定义分隔符字符串转对象
自定义分隔符字符串(如name:张三;age:25或|name=张三|age=25)需通过字符串分割和手动映射为对象。
方法:字符串分割 + 字典推导(Python)
示例代码:
# 分隔符为`;`,键值对用`=`连接
custom_str = "name=张三;age=25;city=北京"
# 分割为键值对列表
pairs = custom_str.split(';')
# 转换为字典
obj = {}
for pair in pairs:
if '=' in pair:
key, value = pair.split('=', 1)
obj[key] = value
print(obj)
# 输出:{'name': '张三', 'age': '25', 'city': '北京'}
# 更简洁的字典推导式
obj_comp = {pair.split('=', 1)[0]: pair.split('=', 1)[1] for pair in pairs if '=' in pair}
print(obj_comp) # 同上
JavaScript示例:
const customStr = "name=张三;age=25;city=北京";
const pairs = customStr.split(';');
const obj = {};
pairs.forEach(pair => {
const [key, value] = pair.split('=');
if (key && value) {
obj[key] = value;
}
});
console.log(obj); // { name: '张三', age: '25', city: '北京' }
其他格式:YAML/INI字符串转对象
YAML字符串(使用PyYAML库)
安装:pip install pyyaml
import yaml
yaml_str = """
name: 张三
age: 25
hobbies:
- 阅读
- 编程
"""
obj = yaml.safe_load(yaml_str)
print(obj)
# 输出:{'name': '张三', 'age': 25, 'hobbies': ['阅读', '编程


还没有评论,来说两句吧...