【问题标题】:Generate " | " in JSON to YML在 JSON 中生成“|”到 YAML
【发布时间】:2021-07-14 11:34:55
【问题描述】:

我有一个格式如下的 json:

{"nlu": [
   {"intent": "Greeting", "examples": ["Hi","Hello"]},
   {"intent": "Bye", "examples": ["Good bye","Bye bye"]}
]}

我想将此 json 转换为 yml 格式,如下所示:

nlu:
- intent: Greeting
  examples: |
     - Hi
     - Hello
- intent: Bye
  examples: |
     - Good bye
     - Bye bye

我也是这样转换的,但是“|”缺少符号(在“示例”后面):

nlu:
- intent: Greeting
  examples:
     - Hi
     - Hello
- intent: Bye
  examples:
     - Good bye
     - Bye bye

你能帮我解决这个问题吗?我尝试将数据从 json 格式自动输入 RASA。 非常感谢!

【问题讨论】:

    标签: json yaml


    【解决方案1】:

    | 启动一个 YAML 文字块标量,因此其中的所有内容都是一个字符串。您希望该单个字符串也被编码为 YAML。这意味着您必须进行两步转换:

    • 将所有 examples 值转换为 YAML 并将其原始值替换为生成的 YAML 字符串
    • 将整个结构转储为 YAML,将 examples 字符串呈现为文字块标量。

    这是一个在 Python 中执行此操作的解决方案:

    import yaml, sys
    
    input = """
    {"nlu": [
       {"intent": "Greeting", "examples": ["Hi","Hello"]},
       {"intent": "Bye", "examples": ["Good bye","Bye bye"]}
    ]}
    """
    
    class Literal(str):
        pass
    
    def literal_presenter(dumper, data):
        return dumper.represent_scalar("tag:yaml.org,2002:str", data, style="|")
    yaml.add_representer(Literal, literal_presenter)
    
    content = yaml.safe_load(input)
    for item in content["nlu"]:
      item["examples"] = Literal(yaml.dump(item["examples"]))
    
    yaml.dump(content, sys.stdout, sort_keys=False)
    

    为了让 PyYAML 将字符串转储为文字块标量,它使用类 Literal 并为其注册一个自定义表示器。

    代码能够使用 PyYAML 加载原始 JSON,因为 YAML 是 JSON 的超集。

    输出:

    nlu:
    - intent: Greeting
      examples: |
        - Hi
        - Hello
    - intent: Bye
      examples: |
        - Good bye
        - Bye bye
    

    【讨论】:

      猜你喜欢
      • 2020-09-12
      • 1970-01-01
      • 1970-01-01
      • 2019-01-25
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      • 2022-08-09
      • 2014-10-27
      相关资源
      最近更新 更多