如何使用Python将缩进的.yaml文件转换为json?

时间:2017-02-20 10:49:22

标签: javascript python json yaml

目前我正在开展一个项目,我需要将多个.yaml filse转换为.json才能使用它。

示例.yaml-file:

id: 1
name: Tony
created: ruby/object:ActiveSupport::TimeWithZone
  zone: utc
  time: 10:00:00
updated: ruby/object:ActiveSupport::TimeWithZone
  zone: utc
  time: 10:00:01

但是,当我尝试使用此脚本转换它时:

python -c 'import sys, yaml, json; json.dump(yaml.load(sys.stdin), 
sys.stdout, indent=4)' < test.yaml > test.json

我返回此错误:

expected <block end>, but found '?' in "<stdin>", line 9, column 5

修改1:已更改.yaml文件示例(created_at)

2 个答案:

答案 0 :(得分:2)

也许yaml文件应该是这样的:

expected_link = 'https://nolp.dhl.de/nextt-online-public/set_identcodes.do?lang=de&idc=1234567890'
expect(page).to have_content(ERB::Util.html_escape(expected_link))

运行此代码:

id: 1
name: Tony
created:
  zone: utc
  time: '2016-11-24 10:00:00'
updated:
  zone: utc
  time: '2016-11-24 10:00:01'

你会得到:

with open('test.yaml') as f:       
    dataMap = yaml.safe_load(f) 
    print (json.dumps(dataMap)) 

希望这有帮助。

答案 1 :(得分:0)

您的输入不正确YAML,因为您没有键/值对:

created: ruby/object:ActiveSupport::TimeWithZone

不缩进,后跟缩进的键/值对:

  zone: utc

可能的原因是您遗漏了!为红宝石对象引入标记。你应该摆脱完整的ruby/object:ActiveSupport::TimeWithZone

你得到的信息是标量不允许使用冒号是因为PyYAML不支持&#39;:&#39;在字符串标量(ruby/object:ActiveSupport::TimeWithZone)中,即使该冒号后面没有空格。我建议你更新到ruamel.yaml(它支持YAML 1.2和更多的东西。免责声明:我是该软件包的作者)。 您还应该使用&#39; .safe_load()&#39;而不是`.load()&#39; (这不安全!)

给出正确的YAML输入:

id: 1
name: Tony
created: 
  zone: utc
  time: 10:00:00
updated: 
  zone: utc
  time: 10:00:01

并且正在运行:

python -c 'import sys, ruamel.yaml, json; json.dump(ruamel.yaml.safe_load(sys.stdin), sys.stdout, indent=4)' < test.yaml

你会得到:

{
    "updated": {
        "zone": "utc", 
        "time": 36001
    }, 
    "id": 1, 
    "name": "Tony", 
    "created": {
        "zone": "utc", 
        "time": 36000
    }