toml与json联系对比

前言

本文简单介绍toml;并且和json转化做对比,以及我对toml设计的理解。

参考:

TOML: 简体中文 v1.0.0

json和toml转化工具

在线JSON转toml-toml转JSON - bejson在线工具

正文

数组

说白了,就是一个变量名,有多个变量的值。值的类型,可以相同,可以不同。

integers = [ 1, 2, 3 ]
colors = [ "红", "黄", "绿" ]
nested_array_of_ints = [ [ 1, 2 ], [3, 4, 5] ]
nested_mixed_array = [ [ 1, 2 ], ["a", "b", "c"] ]
string_array = [ "所有的", '字符串', """是相同的""", '''类型''' ]

# 允许混合类型的数组
numbers = [ 0.1, 0.2, 0.5, 1, 2, 5 ]
contributors = [
  "Foo Bar <foo@example.com>",
  { name = "Baz Qux", email = "bazqux@example.com", url = "https://example.com/bazqux" }
]

对应josn

{
  "integers": [ 1,2,3 ],
  "colors": ["红",黄","绿"],
  "nested_array_of_ints": [[1,2],[3,4,5]],
  "nested_mixed_array": [[1,2],["a","b","c"]],
  "string_array": ["所有的","字符串","是相同的","类型"],
  "numbers": [0.1,0.2,0.5,1,2,5],
  "contributors": [
    "Foo Bar <foo@example.com>",
    {
      "name": "Baz Qux",
      "email": "bazqux@example.com",
      "url": "https://example.com/bazqux"
    }
  ]
}

在json中对应“对象”;要注意的是json中,对象有的有名字,有的没有名字。

toml方括号,就说明用的是“表”。也就是json中的对象。

创建表的方法:

#创建了sites对象,内容有site1
[sites]
site1 = "www.runoob.com"

#创建了“嵌套”对象
[dog]
[dog."tater.man"]
[dog."tater.man".type]
name = "pug"

#等价于上面
dog."tater.man".type.name = "pug"

例子:

{
    "name":"runoob",
    "alexa":10000,
    "sites": {
        "site1":"www.runoob.com",
        "site2":"m.runoob.com",
        "site3":"c.runoob.com"
    }
}


转成toml
name = "runoob"
alexa = 10000
[sites]
site1 = "www.runoob.com"
site2 = "m.runoob.com"
site3 = "c.runoob.com"

嵌套

{
  "dog": {
    "tater": {
      "type": {
        "name": "pug"
      }
    }
  }
}


转成toml
[dog]
[dog.tater]
[dog.tater.type]
name = "pug"
#等价于上面——没有括号
dog.tater.type.name = "pug"

demo

[merter1.VoltageSurge]
 STimeStamp= ["1","2","3"]
 ETimeStamp= ["4","5","6"]
 
[merter1.VoltageDip]
 STimeStamp= ["1","2","3"]
 ETimeStamp= ["1","2","3"]

[merter2.VoltageSurge]
 STimeStamp= ["1","2","3"]
 ETimeStamp= ["1","2","3"]
[merter2.VoltageDip]
 STimeStamp= ["1","2","3"]
 ETimeStamp= ["1","2","3"]

const auto data = toml::parse("C:/Users/45428/Desktop/test.toml");
	for (const auto& kv : data.as_table()) {
		const toml::value& value = kv.second;
		// 遍历子表
		const toml::table& sub_table = value.as_table();
		for (const auto& sub_kv : sub_table) {
			const toml::key& sub_key = sub_kv.first;
			const toml::value& sub_value = sub_kv.second;

			const auto STimeStamp = toml::find<std::vector<string>>(sub_value, "STimeStamp");
			const auto ETimeStamp = toml::find<std::vector<string>>(sub_value, "ETimeStamp");
		}
	}

内联表

和“表”一样。

他的存在就是让文件变得更加紧凑相对于“表”来说。

既然是为了更紧凑,就不允许他换行。

你要内联表,就得在大括号里定义完,不允许再起一行后面增加。或者用内联表去增加一般的表。

#表
[name]
first = "Tom"
last = "Preston-Werner"
[point]
x = 1
y = 2
[animal]
type.name = "pug"

#内联表——更紧凑——上下都一样
name = { first = "Tom", last = "Preston-Werner" }
point = { x = 1, y = 2 }
animal = { type.name = "pug" }

表数组

就是表里嵌套数组;

对应的json就是对象嵌套数组。

【【数组名字】】

例子:

{
  "products": [#数组products——两个元素
    {
      "name": "Hammer",
      "sku": 738594937
    },
    {
      "name": "Nail",
      "sku": 284758393
    }
  ],
  "products1": [#数组products1——一个元素
    {
      "name": "Hammer",
      "sku": 738594937
    }
  ]
}

#数组products
[[products]]
name = "Hammer"
sku = 738594937
[[products]]
name = "Nail"
sku = 284758393

#数组products1
[[products1]]
name = "Hammer"
sku = 738594937

嵌套

[[fruits]]
name = "apple"

[fruits.physical]  # 子表
color = "red"
shape = "round"

[[fruits.varieties]]  # 嵌套表数组
name = "red delicious"

[[fruits.varieties]]
name = "granny smith"

[[fruits]]
name = "banana"

[[fruits.varieties]]
name = "plantain"


{
  "fruits": [
    {
      "name": "apple",
      "physical": {
        "color": "red",
        "shape": "round"
      },
      "varieties": [
        {
          "name": "red delicious"
        },
        {
          "name": "granny smith"
        }
      ]
    },
    {
      "name": "banana",
      "varieties": [
        {
          "name": "plantain"
        }
      ]
    }
  ]
}

表和表数组的区别

【对象名】:toml的表,json的对象

{
  "a": {}
}

【【对象名】】:toml的表数组,json的数组里放对象

{
  "a": [
    {}
  ]
}

嵌套:

【a.b】a对象嵌套b对象

{
  "a": {
    "b": {}
  }
}

【【a.b】】a数组嵌套b对象

[[a.b]]

{
  "a": {
    "b": [
      {}
    ]
  }
}

嵌套的都是对象

<think>好的,用户问的是关于Python中使用`import toml`和`cfg = toml.load(config_path)`的问题。首先,我需要确认用户的需求。他们可能是在处理配置文件,想了解如何使用TOML格式进行读取。 首先,我应该解释TOML是什么。TOML是一种易于阅读的配置文件格式,适合作为INI的替代品。需要提到它的结构,比如节、键值对,以及支持的数据类型,比如字符串、数字、布尔值、数组和表。 然后,用户使用了`toml`模块,需要说明安装步骤,比如用pip安装tomli或tomllib,特别是Python版本差异。Python 3.11及以上内置了tomllib,但可能需要区分读取方式,比如tomli用于解析,而tomllib可能需要以二进制模式读取文件。 接下来,解释代码示例。用户给出的代码是加载配置文件,可能需要分步骤讲解:导入模块、加载文件,然后访问配置项。要强调文件路径的处理,比如相对路径或绝对路径,以及如何处理可能出现的异常,比如文件不存在或格式错误。 还要提醒用户注意数据类型转换,TOML中的某些类型可能在Python中有不同的表示,比如时间日期对象。此外,可能提到编写TOML文件的注意事项,比如缩进和格式,避免常见错误。 用户可能的疑问点包括:如何安装库,不同Python版本的处理,如何访问嵌套的配置项,错误处理等。需要确保回答覆盖这些方面,结构清晰,分步骤说明,让用户能一步步操作。 最后,总结使用TOML的好处,比如可读性好,适合人类编辑,同时也能被机器高效解析。可能还需要对比其他格式,比如JSON或YAML,指出TOML的优势,比如更简洁的语法,适合配置文件。</think>我来为您分步介绍TOML文件的读取方法: 1. TOML格式简介 TOML(Tom's Obvious Minimal Language)是一种易读的配置文件格式,主要特点: - 使用`键 = 值`的显式语法 - 支持嵌套表结构(用[table]表示) - 支持多种数据类型:字符串/整数/浮点数/布尔值/日期/数组 - 语法规范严格,适合替代INI格式 2. 安装依赖库 根据Python版本选择: ```bash # 对于Python < 3.11 pip install tomli # 对于Python ≥ 3.11(内置tomllib库) # 无需安装,但需注意读取方式 ``` 3. 基础使用代码示例 ```python import toml # 或使用 tomli/tomllib # 加载配置文件 config_path = "config.toml" with open(config_path, "r", encoding="utf-8") as f: cfg = toml.load(f) # tomllib需用二进制模式:open(... , "rb") # 访问配置项示例 print(cfg["database"]["host"]) # 访问嵌套配置 print(cfg["server"]["ports"][0]) # 访问数组 ``` 4. 配置文件示例(config.toml) ```toml [database] host = "localhost" port = 5432 ssl = true connection_limit = 1000 [server] ports = [8000, 8001, 8002] startup_timeout = 30.5 [logging] levels = ["debug", "info", "warning"] ``` 5. 注意事项 - 文件编码建议使用UTF-8 - 路径处理建议使用pathlib: ```python from pathlib import Path config_path = Path(__file__).parent / "config.toml" ``` - 异常处理推荐添加: ```python try: cfg = toml.load(config_path) except FileNotFoundError: print(f"配置文件 {config_path} 不存在") except toml.TomlDecodeError: print("TOML格式解析错误") ``` - 数据类型转换:TOML的日期时间会被转换为Python的datetime对象 6. 高级功能 - 支持多级嵌套表: ```toml [user.profile] name = "Alice" roles = ["admin", "developer"] ``` - 内联表语法: ```toml point = { x = 1, y = 2 } ``` - 数组表: ```toml [[products]] name = "Hammer" sku = 738594937 [[products]] name = "Nail" sku = 284758393 ``` TOML格式特别适合需要人工维护的配置文件场景,其设计目标是在保持可读性的同时提供精确的数据结构表示能力。相比JSON/YAML,TOML对多级嵌套结构的表示更加直观,且注释支持完善(使用#符号)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值