JSON
文章目录
- 一、概念
- 1.json官网
- 2.json的概念
- 3.序列化方案:xml、json
- 二、json的数据类型
- 1.json的键:必须是带双引号的字符串
- 2.json的值:6种数据类型
- (1)对象 { }
- (2)数组 [ ]
- 三、Python中的json
- 1.序列化:Python对象 转 json
- 2.反序列化:json 转 Python对象
- (1)读取json文件:load()
- (2)读取json字符串:loads()
- (3)获取json中的键:get()
- 四、C++中的json
- 1.nlohmann/json库
- 2.json对象
- 3.json对象是array:下标填数字
- 4.序列化、反序列化
- 五、json的注释
一、概念
1.json官网
1.json官网:www.json.org
2.json的维基百科:https://en.wikipedia.org/wiki/JSON
2.json的概念
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人类阅读和编写,同时也易于机器解析和生成。JSON 主要用于服务器与客户端之间的数据交换,尤其在 Web 开发中应用广泛。
JSON 由 JavaScript 的对象表示法(object notation)演变而来,但由于其简洁性和可移植性,它被广泛应用于多种编程语言中。JSON 是完全语言独立的,但是它使用了 JavaScript 的语法,因此非常易于理解和使用。
3.序列化方案:xml、json
JSON比XML更轻量级。
二、json的数据类型
json既可以是object (键值对的集合),也可以是array (值的有序集合)。
json支持嵌套结构。
1.json的键:必须是带双引号的字符串
键(Key)要求
必须是字符串:在 JSON 中,所有的键(key)必须是字符串,并且必须用双引号 " 包裹。JSON 不允许使用数字、布尔值、null 或其他类型作为键。
有效的键:“name”, “age”, “address”
无效的键:name, age, 123(这些没有双引号,不能作为 JSON 键)
区分大小写:JSON 键是区分大小写的,这意味着 “name” 和 “Name” 被视为不同的键。
不能包含某些特殊字符:键名虽然是字符串,但通常建议避免包含特殊字符,如空格、逗号、冒号等,因为这可能导致解析错误。通常,JSON 键的字符集应限制为字母、数字、下划线 _、冒号等。
2.json的值:6种数据类型
json值的数据类型 | 示例 | Python映射类型 | C++映射类型 |
---|---|---|---|
对象 (object) | {“name” : “Edward”, “age” : 25} | 字典 dict | nlohmann::json (嵌套对象) |
数组 (array) | [“apple”, “banana”] | 列表 list | std::vector<T> |
字符串 (string) | “Edward” | str | std:string |
数字 (number) | 25, 3.14 | int 或 float | int 或 double |
布尔值 (boolen) | true, false | True 或 False | bool |
空值 (null) | null | None | nullptr |
(1)对象 { }
对象(Object) { }
对象:由一对大括号 {} 包围,包含键值对。
①键和值之间用冒号:
分隔
②键值对之间用逗号,
分隔。
例如:
{"name" : "Edward","age" : 25,"city" : "Shanghai","hobbies" : ["running", "coding", "travelling", "reading"]
}
(2)数组 [ ]
数组 (Array) [ ]
数组:由一对方括号 [] 包围,包含多个值,值之间用逗号 , 分隔。例如:
["apple", "banana", "cherry"]
{"test_cases": [{"sequence_str": ["begin","sip_90","vms_window","pcie_speed_switch","end"],"repeat": 3,"id": "fail_test"},{"sequence_str": ["begin","pcie_3_7","end"],"repeat": 1,"id": "ppcie_test"}]}
三、Python中的json
1.序列化:Python对象 转 json
json.dump() 和 json.dumps() 是序列化的操作( 将 Python 对象转为json字符串)
序列化(Serialization)是将 Python 对象转换为一种可以存储或传输的格式,例如 JSON 格式。
import jsondata = {"name": "Alice", "age": 25}# 使用 json.dump() 序列化为 JSON 并写入文件
with open('data.json', 'w') as file:json.dump(data, file)# 使用 json.dumps() 序列化为 JSON 字符串
json_string = json.dumps(data)
print(json_string) # 输出: {"name": "Alice", "age": 25}
2.反序列化:json 转 Python对象
json.load() 和 json.loads() 是反序列化的操作 (将 json 字符串转为 Python 对象)
json.load(file) 是 Python 标准库 json 模块中的一个方法,用于从文件中读取 JSON 数据并将其解析为 Python 对象
(1)读取json文件:load()
with open('data.json', 'r') as file:data = json.load(file)
举例:
import jsondef print_json():with open('my_json.json' , 'r', encoding='utf-8') as file:data = json.load(file) #使用 json.load()函数,读取json文件内容,并解析为Python对象print(data) #输出json中的所有数据def print_json_particular():with open('my_json.json' , 'r', encoding='utf-8') as file:data = json.load(file)#访问json中的特定数据print(f"name : {data['name']}")print("city : {}".format(data['city']))if __name__ == '__main__':#print_json()print_json_particular()
{"name" : "Edward","age" : 25,"city" : "Shanghai","hobbies" : ["running", "coding", "travelling", "reading"]
}
(2)读取json字符串:loads()
json.load() 用于解析文件中的 JSON 数据。
json.loads() 用于解析字符串中的 JSON 数据
import jsonjson_string = '{"name": "Alice", "age": 25}'data = json.loads(json_string) # 解析 JSON 字符串print(data)
(3)获取json中的键:get()
get()是Python中字典dict的函数,但是可以先用load()函数将json转化为字典,再用get()获取其键
注意,先import json
四、C++中的json
https://blog.csdn.net/Edward1027/article/details/141072003
1.nlohmann/json库
为了解析和处理 JSON 数据,C++ 需要借助第三方库,最常见的库是 nlohmann/json
C++ json库:
github搜json:nlohman/json
header-only形式:只用加头文件,不需要加链接选项
2.json对象
代码链接:https://github.com/WangEdward1027/workflow/blob/main/json/json.cpp
(1)json对象是object:下标填字符串
dump()是序列化
#include <iostream>
#include <string>
#include "nlohmann/json.hpp"
using std::cout;
using std::string;//json对象是obejct: []中是字符串, 整体是{ }
void test1()
{nlohmann::json json_object; //创建一个空的json对象json_object["key"] = "value"; //json对象是一个objectstring context = json_object.dump(); //dump() : 序列化cout << context << "\n";
}//json对象是array: []中是数字, 整体是 [ ]
void test2()
{nlohmann::json json_object; json_object[0] = "value";json_object[1] = 2204;json_object.push_back(1234); //json对象是array,则支持push_back()方法 //加入一个object { }json_object[3]["key1"] = "value1";//加入一个array [ ]nlohmann::json child_object;child_object[0] = "000";child_object.push_back("111");child_object.push_back("222");child_object.push_back("333");json_object.push_back(child_object);cout << json_object.dump() << "\n";
}//nlohmann::json::parse 解析字符串
void test3()
{char str[] = "[1,2,3,{\"key\":456}]";nlohmann::json json_object = nlohmann::json::parse(str); cout << "json_object[0] = " << json_object[0] << "\n";cout << "json_object[1] = " << json_object[1] << "\n";cout << "json_object[2] = " << json_object[2] << "\n";cout << "json_object[3][\"key\"] = " << json_object[3]["key"] << "\n";
}int main()
{test1();/* test2(); *//* test3(); */return 0;
}
3.json对象是array:下标填数字
数组可用push_back方法
4.序列化、反序列化
1.序列化:
dump()方法,将json对象序列化为string字符串
2.反序列化/解码/解析:
parse()方法,将string字符串解析为json对象。要求严格字符串符合json的格式。
五、json的注释
1.标准的 JSON 格式 不支持注释
2.使用键值对模拟注释:
{"_comment": "This is a comment","name": "Alice","age": 30
}
3.在代码中进行注释处理
另一种常见的做法是在代码中处理注释,而不是在 JSON 文件本身中放置注释。例如,在读取 JSON 文件后,使用脚本来忽略注释部分。
例如,你可以在加载 JSON 文件之前,将文件中的注释行(例如以 // 或 /* */ 开头的行)先删除掉:
import jsondef load_json_with_comments(file_path):with open(file_path, 'r') as file:content = file.readlines()# 去掉注释行content = [line for line in content if not line.strip().startswith("//") and not line.strip().startswith("/*")]# 重新将内容拼接成字符串cleaned_content = "".join(content)# 解析 JSONreturn json.loads(cleaned_content)# 加载带注释的 JSON 文件
data = load_json_with_comments("data_with_comments.json")
print(data)
相关文章:
JSON
文章目录 一、概念1.json官网2.json的概念3.序列化方案:xml、json 二、json的数据类型1.json的键:必须是带双引号的字符串2.json的值:6种数据类型(1)对象 { }(2)数组 [ ] 三、Python中的json1.序列化:Python对象 转 json2.反序列化…...
前端常用的方法
时间处理 moment时间处理函数 // 时间日期相关常用的方法变量 import moment from moment;// 获取当前时间 moment export const nowDateMoment moment(new Date()); export const nowDateY moment(new Date()).format(YYYY); export const nowDateM moment(new Date()).f…...
JavaScript 对话框的魔法与艺术
在Web开发的世界里,JavaScript 对话框是用户与网页互动的重要桥梁。它们不仅能够提供即时反馈,还能收集用户的输入信息,从而增强用户体验。本文将深入探讨JavaScript对话框的各种类型、用法及其背后的原理,并通过丰富的实例展示如…...
java+springboot+mysql私人会所管理系统
项目介绍: 使用javaspringbootmysql开发的私人会所管理系统,系统包含管理员、技师、用户角色,功能如下: 管理员:用户管理;服务项目;技师管理;房间管理;预约管理&#x…...
Scrapy 爬虫框架全解析
一、Scrapy 框架概述 基本定义 Scrapy 是一个用 Python 编写的开源网络爬虫框架。它旨在快速、高效地抓取网页数据,可处理大规模的数据抓取任务。基于 Twisted 异步网络库构建,能够并发地处理多个请求,大大提高了数据抓取的速度。遵循 “请求…...
Hive3.X——异常处理Could not create ServerSocket on address 0.0.0.0/0.0.0.0:10000
Hive3.X——异常处理Could not create ServerSocket on address 0.0.0.0/0.0.0.0:10000 01 前言 大数据系列,学到了Hive,搭建环境的时候,因为使用的是本机WSL2(别问为啥不用VMware,问就是条件有限,而且WS…...
【跨库查询、多库查询】.NET开源 ORM 框架 SqlSugar 系列
文章目录 一、跨库方式1:跨库导航二、手动跨库查询三、同服务器:自动查询跨库查询3.1 Mysql和SqlServer自动3.2 自动: PgSql跨Scheme查询3.3 其他库同服务器 四、跨服务器:自动跨库查询4.1 配置SqlServer dblink4.2 配置 Oracle dblink4.3 配…...
【JAVA】Java项目实战—Java 数据库应用项目:学生信息管理系统
本项目将实现一个简单的学生信息管理系统,功能包括学生信息的录入、查询、修改和删除。通过本项目,读者将深入理解Java与数据库交互的基本原理,掌握JDBC(Java Database Connectivity)技术,以及如何构建一个…...
中电金信携手中远海科,共启贸易金融数智新篇章
在数智化转型成为驱动经济社会高质量发展的新引擎背景下,“数智方案”栏目聚焦金融等国计民生重点行业场景,依托中电金信“源启筑基咨询引领应用重构”的产品及服务体系,输出市场洞察和行业解决方案、应用案例,旨在全面推动行业IT…...
有没有办法让爬虫更加高效,比如多线程处理?
要让Python爬虫更加高效,确实可以采用多线程处理。多线程可以显著提高爬虫的效率,因为它允许程序同时执行多个任务,从而减少等待时间。以下是一些提高爬虫效率的方法,特别是通过多线程技术: 1. 多线程爬虫 多线程爬虫…...
Android历史版本主要更新说明
Android 15 Android 15 继续致力于构建注重隐私和安全保护的平台,助您提高效率,同时还引入了多项新功能,帮您打造精美应用、卓越的媒体和相机体验,并提供直观的用户体验。在平板电脑和可折叠设备上更能凸显出这些优势。 Android…...
测试岗位应该学什么
以下是测试岗位需要学习的一些关键内容: 1. 测试理论和方法 - 了解不同类型的测试,如功能测试、性能测试、压力测试、安全测试、兼容性测试等。 - 掌握测试策略和测试计划的制定。 2. 编程语言 - 至少熟悉一种编程语言,如 Python、Java…...
华为HarmonyOS NEXT 原生应用开发: 数据持久化存储(用户首选项)的使用 token令牌存储鉴权!
Preferences 数据持久化存储 用户首选项(Preferences) 1. 封装 仓库工具类 ● 这里可以选择将 数据字段 key 抽取为一个静态方法,这里选择让用户传参,看起来较容易理解! /*** 首选项 preferences - 实现数据持久化…...
【AIStarter】告别复杂转换 - MinerU整合包实现PDF到Markdown的无缝转变
在数字化时代,信息的传递与共享变得愈发重要。文档格式之间的转换成为了日常工作中不可或缺的一部分。为了满足用户对高效工作流程的需求,新版MinerU整合包应运而生,它不仅简化了从PDF到Markdown的转换过程,还为用户带来了前所未有…...
Jenkins参数化构建详解(This project is parameterized)
本文详细介绍了Jenkins中不同类型的参数化构建方法,包括字符串、选项、多行文本、布尔值和git分支参数的配置,以及如何使用ActiveChoiceParameter实现动态获取参数选项。通过示例展示了传统方法和声明式pipeline的语法 文章目录 1. Jenkins的参数化构建1…...
服务器批量清理redis keys,无法适用客户端必须直连的情况
在 Redis 中,批量清理指定模式的键(例如 memberCardData:*)可以通过多种方法来实现。需要注意的是,Redis 的命令执行是单线程的,因此对大量键进行操作时可能会阻塞服务器。以下是几种常见的方法: shell K…...
单元测试SpringBoot
添加测试专用属性 加载测试专用bean Web环境模拟测试 数据层测试回滚 测试用例数据设定...
牛客网刷题 | BC126 小乐乐查找数字
😁博客主页😁:🚀从0至1-CSDN博客🚀 🤑博客内容🤑:🍭C语言、C、数据结构、嵌入式、Linux🍭 😎本文内容🤣:🍭BC1…...
Node一、fs 模块、path 模块、端口号、 http 模块、
一、Node.js了解 Node.js是一个跨平台JavaScript运行环境,使开发者可以搭建服务器端的JavaScript应用程序。 概念:使用 Node.js 编写后端程序 / 支持前端工程化 ✓ 后端程序:提供接口和数据,网页资源等 ✓ 前端工程化 &#x…...
k8s service 配置AWS nlb load_balancing.cross_zone.enabled
在Kubernetes中配置NLB(Network Load Balancer)的跨区域负载均衡(cross-zone load balancing),需要使用服务注解(service annotations)来实现。根据AWS官方文档,以下是配置NLB跨区域…...
[分布式即时通讯系统] 注册类完善
我们在qss里添加err_tip样式,根据不同的状态做字体显示 #err_tip[statenormal]{color: green; } #err_tip[stateerr]{color: red; } 接下来项目中添加global.h和global.cpp文件,global.h声明repolish函数,global.cpp用来定义这个函数。 .h…...
C#使用HttpWebRequest下载文件
public static bool HttpDownloadFile(string downloadUrl, string localPath, log4net.ILog log) { bool bFlagDownloadFile false; //log.Debug(“HttpDownloadFile–准备以HTTP的方式下载文件,url:[” downloadUrl “]本地文件:【” localPath “…...
CentOS7环境安装php
直接安装 yum -y install php CentOS7默认安装是php5,现在php已有8.3版本 先查看php -v 版本 如果是低版本,可以删除 yum remove php yum remove php-fpm yum remove php-common 一、添加REMI存储库 yum install epel-release yum install -y …...
【Excel学习记录】04-排序和筛选
1.排序 (1)简单排序 不建议选中某列后进行排序 可以选中一个单元格或者整个表格→开始→编辑→排序和筛选→升序/降序 (2)多条件排序 可以选中一个单元格或者整个表格→开始→编辑→排序和筛选→自定义排序→指定关键字、比较内…...
Python轻松获取抖音视频播放量
现在在gpt的加持下写一些简单的代码还是很容易的,效率高,但是要有一点基础,不然有时候发现不了问题,这些都需要经验积累和实战,最好能和工作结合起来,不然很快一段时间就忘的干干净净了,下面就是…...
恢复删除的文件:6个免费Windows电脑数据恢复软件
数据恢复软件可帮助您从众多存储设备中恢复损坏或删除的数据。您可以使用这些文件恢复软件来检索文件、文档、视频、图片等。这些应用程序支持多种标准文件格式,如 PNG、RTF、PDF、HTML、JPG、MP3 等。 经过超过 75 小时的研究,我分析了 25 最佳免费数据…...
Go的Gin比java的Springboot更加的开箱即用?
前言 隔壁组的云计算零零后女同事,后文简称 云女士 ,非说 Go 的 Gin 框架比 Springboot 更加的开箱即用,我心想在 Java 里面 Springboot 已经打遍天下无敌手,这份底蕴岂是 Gin 能比。 但是云女士突出一个执拗,非我要…...
Java 中枚举的 toString 方法及其字段信息展示
在 Java 编程中,枚举(enum)是一种特殊的数据类型,用于定义一组固定的常量。枚举类型不仅限于简单的常量定义,还可以包含字段、方法以及构造函数,从而使其具备更强的表达能力。toString 方法是 Java 中所有对…...
Python数据分析(OpenCV视频处理)
处理视频我们引入的还是numpy 和 OpenCV 的包 引入方式如下: import numpy as np import cv2 我们使用OpenCV来加载本地视频,参数就是你视频的路径就可以 #加载视频 cap cv2.VideoCapture(./1.mp4) 下面我们进行读取视频 #读取视频 flag,frame cap.re…...
DocFlow票据AI自动化处理工具:出色的文档解析+抽取能力,提升企业文档数字化管理效能
目录 财务应付 金融信贷业务 近期,DocFlow票据自动化产品正式上线。DocFlow是一款票据AI自动化处理工具,支持不同版式单据智能分类扩展,可选功能插件配置流程,满足多样业务场景。 随着全球化与信息化进程,企业的文件…...
python编程Day15-UnitTest框架的介绍
框架 framework为了解决一类事情的功能集合 Unittest 框架 是 Python 自带的单元测试框架 自带的, 可以直接使用, 不需要单外安装 测试人员 用来做自动化测试, 作为自动化测试的执行框架, 即 管理和执行用例的 使用原因 能够组织多个用例去执行提供丰富的断言方法能够生成测试报…...
Linux——进程控制模拟shell
1.进程创建 我们在之前的文章中介绍过进程创建的方法,可以通过系统调用接口fork来创建新的进程。 fork在创建完新的子进程之后,返回值是一个pid,对于父进程返回子进程的pid,对于子进程返回0。fork函数后父子进程共享代码ÿ…...
OpenCV的图像矫正
一、原理 图像矫正的原理是透视变换,下面来介绍一下透视变换的概念。 透视变换(Perspective Transform)基于一个4对点的映射关系(4个源点到4个目标点),通过这些点之间的映射,可以计算一个变换…...
基于php求职招聘系统设计
摘要 随着社会信息化时代的到来,如今人们社会的生活节奏普遍加快,人们对于工作效率的要求也越来越高,企业 举办招聘会耗时耗财,个人参加招聘会漫无目的寻找不到“方向”,网络搜索工作量目的性不强,信息量繁…...
并行口的基本概念
单片机的并行口结构包括多个并行I/O端口,用于与外部设备进行并行数据传输。这些端口能够直接读写外部存储器、显示设备、打印机等外设的数据,是单片机与外界交互的重要通道。在深入探讨之前,我们先简要了解下单片机的基本概念。 单片机&…...
(六)机器学习 - 正态数据分布
正态数据分布,也称为高斯分布(Gaussian distribution),是一种在统计学中非常重要的概率分布。它描述了自然和社会科学中许多现象的分布情况,如人的身高、体重、智商等。正态分布的图形特征是中间高、两边低,…...
电脑系统报错找不到d3dcompiler_47.dll怎么修复?怎么预防“d3dcompiler_47.dll”文件缺失?
“d3dcompiler_47.dll”文件缺失的修复与预防策略 在日常使用电脑软件,尤其是运行大型游戏或图形密集型应用时,我们可能会遇到一些令人困惑的系统报错。其中之一便是“找不到d3dcompiler_47.dll”的错误提示。这个错误不仅影响软件的正常运行࿰…...
Github 2024-12-12 Go开源项目日报Top10
根据Github Trendings的统计,今日(2024-12-12统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10Go Ethereum: 以太坊Go语言官方实现 创建周期:3717 天开发语言:Go协议类型:GNU Lesser General Public License v3.0Star数量:4504…...
RIP协议
介绍 路由信息协议RIP(Routing Information Protocol)是基于距离矢量(Distance-Vector)算法的路由协议,它是一种较为简单的内部网关协议IGP(Interior Gateway Protocol)。它的主要功能是帮助路…...
vue-router查漏补缺
一、动态路由匹配 1.带参数的动态路由匹配 import User from ./User.vue// 这些都会传递给 createRouter const routes [// 动态字段以冒号开始{ path: /users/:efg, component: User }, ]这种方式的路由会匹配到/users/abc或者/users/123,路径参数用冒号:表示,并…...
使用Flink CDC实现 Oracle数据库数据同步的oracle配置操作
使用Flink CDC实现 Oracle数据库数据同步的oracle配置操作,包括开启日志归档和用户授权。 flink官方参考资料: https://nightlies.apache.org/flink/flink-cdc-docs-master/zh/docs/connectors/flink-sources/oracle-cdc/ 操作步骤: 1.启用…...
mqtt.js 客户端封装
mqtt.js 客户端封装 没封装前使用 const client mqtt.connect(ws://10.10.20.9:9001) onMounted(() > {const topicList []const channelCount 12for(let i 0; i < channelCount; i) {topicList.push(/test/sendImage${i 1})}client.on(connect, () > {console…...
www.aws.training网站的账户密码如何修改
www.aws.training网站的账户密码如何修改 参加aws考试后, 账号密码如何修改呢? 是不是找了好久都找不到. 右上角, 我的账户, 点击注销. 然后会跳到页面: 点击那个网址链接, 进入新的页面,点安全: 右上角: 更改密码. 按提示来就好....
使用Python实现高性能数据存储
在数据驱动的时代,处理和存储海量数据已成为关键需求。高性能数据存储不仅能够确保数据的快速读写,还能提升系统的整体性能。Python作为一种灵活且功能强大的编程语言,提供了多种高效的数据存储解决方案。本文将详细介绍如何使用Python实现高…...
[已解决]nvm安装node.js 报错 拒绝访问此应用无法在你电脑上运行
报错如下: 出错背景: 心血来潮把node删掉重新安装,想用nvm来进行管理node 出错原因: npm下载失败、下载不完整 不完整的npm展示: 出错根本原因: 可能因为镜像源或者网络波动,导致node下载…...
图文检索(36):Decomposing Semantic Shifts for Composed Image Retrieval
Decomposing Semantic Shifts for Composed Image Retrieval 摘要方法3.1 前期准备3.2 视觉语言表示3.3 降级过程3.4 升级过程3.5 训练和推理 结论 发布时间(2024 AAAI) 标题:分解语义转换以实现组合图像检索 摘要 语义转换网络 (SSN)&…...
批量计算(Batch Processing)
批量计算(Batch Processing)是一种数据处理方式,指的是将大量任务或数据分批次进行处理,而不是实时处理每一个任务。这种处理方式通常在任务之间没有依赖关系时使用,可以大大提高计算效率和资源利用率。批量计算广泛应…...
Linux yum-config-manager命令异常
错误信息 使用 yum-config-manager命令时错误信息如下 sudo yum-config-manager \ > --add-repo \ > https://download.docker.com/linux/centos/docker-ce.repo sudo: yum-config-manager: command not found 解决办法 第一步: sudo yum -y install yum-u…...
【C++】关联存储结构容器-set(集合)详解
目录 一、基本概念 二、内部实现 三、常用操作 3.1 构造函数 3.2 插入操作 3.3 删除操作 3.4 查找操作 3.5 访问元素 3.6 容量操作 3.7 交换操作 四、特性 五、应用场景 结语 一、基本概念 set是C标准模板库(STL)中的一种关联容器…...
如何利用SPSS软件进行多组间显著性检验以abcd显示
1.SPSS软件中进行多组间的显著性检验 要在SPSS软件中进行多组间的显著性检验,并以abcd显示结果,你可以按照以下步骤操作: 数据准备: 确保你的数据已经正确输入SPSS,其中每行代表一个观测值,包含至少两列&a…...