首页 > 解决方案 > 将原始文本转换为 JSON 数据

问题描述

我正在尝试实现将原始文本数据转换为 JSON 格式的解析器。正文将给出如下。

(一个例子)

元素的顺序将按照给定的顺序。

我想要的所需输出如下:

{
 name: "menu name",
 sections: [
  {
     name: "Section name",
     items: [{
        name: "item name",
        description: "description",
        price: 23.00
     },
     {
        name: "item name",
        description: "description",
        price: 43.00
     },
    ]
   }
 ]
}

注意:每个部分可以有多个项目,每个菜单可以有多个部分。因此应该保持顺序,即如果出现新部分,则下面的项目现在应该是该部分的一部分。

我尝试了一个使用字符串解析的解决方案,它工作正常,但我想知道执行此任务的标准方法。

标签: javascriptjsonparsing

解决方案


由于预期的输出是 JSON,因此使用面向 JSON 的工具(例如 )可能是有意义的。当然有许多不同的可能方法,但这里有一种简单、直接、易于扩展并且在某些方面易于理解的方法,至少对于那些熟悉 JSON 查询语言的人来说是这样。

下面的程序将为每个“菜单”生成一个 JSON 对象(即,每次出现“# Menu Name”行)。

菜单.jq

# The next key name in an item
def keyname:
  if (.description | not) then "description"
  elif (.price | not) then "price"
  elif (.url | not) then "url"
  else length|tostring
  end;

def menu_name($s):
  . += [{name: $s}];
def section_name($s):
  .[-1].sections += [{name: $s}];
def item_name($s):
  .[-1].sections[-1].items += [{name: $s}];
def item_description($s):
  (.[-1].sections[-1].items[-1]|keyname) as $key
  | .[-1].sections[-1].items[-1][$key] = $s;

reduce inputs as $in ([];
  if $in|test("^ *$") then .       # ignore blank lines
  else ($in|split(" ")) as $tokens
  | ($in|sub("[^ ]* *";"")) as $phrase
  | if $tokens[0] == "#"     then menu_name( $phrase )
    elif $tokens[0] == "##"  then section_name( $phrase )
    elif $tokens[0] == "###" then item_name( $phrase )
    elif $tokens[0] == ">"   then item_description( $phrase )
    else .
    end
  end )
| .[]  # stream the menus

调用

上述用途inputs,因此-n命令行选项至关重要:

jq -n -f menus.jq input.txt

输出

使用样本输入:

{
  "name": "Menu Name",
  "sections": [
    {
      "name": "Section Name",
      "items": [
        {
          "name": "Item Name",
          "description": "Description",
          "price": "Price",
          "url": "Image URL (optional)"
        },
        {
          "name": "Item Name 2",
          "description": "Description",
          "price": "Price",
          "url": "Image URL (optional)"
        }
      ]
    }
  ]
}

推荐阅读