javascript - 将原始文本转换为 JSON 数据
问题描述
我正在尝试实现将原始文本数据转换为 JSON 格式的解析器。正文将给出如下。
(一个例子)
- # 菜单名称
- ## 部分名称
- ### 项目名
- > 说明
- > 价格
> 图片网址(可选)
### 项目名称 2
- > 说明
- > 价格
- > 图片网址(可选)
元素的顺序将按照给定的顺序。
我想要的所需输出如下:
{
name: "menu name",
sections: [
{
name: "Section name",
items: [{
name: "item name",
description: "description",
price: 23.00
},
{
name: "item name",
description: "description",
price: 43.00
},
]
}
]
}
注意:每个部分可以有多个项目,每个菜单可以有多个部分。因此应该保持顺序,即如果出现新部分,则下面的项目现在应该是该部分的一部分。
我尝试了一个使用字符串解析的解决方案,它工作正常,但我想知道执行此任务的标准方法。
解决方案
由于预期的输出是 JSON,因此使用面向 JSON 的工具(例如jq )可能是有意义的。当然有许多不同的可能方法,但这里有一种简单、直接、易于扩展并且在某些方面易于理解的方法,至少对于那些熟悉 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)"
}
]
}
]
}
推荐阅读
- javascript - 当我在 react js 中使用这个插件 react-google-maps 设置状态时,onDrag 函数不起作用
- reactjs - React 中的样式化组件,找到对应的组件
- npm - 提高 Azure DevOps npm 构建速度?
- reactjs - React:我想提交一个表单并想通过钩子(useSelector和useDispatch)将数据保存在redux store中
- linux - 如何在linux卸载过程中删除当前工作目录的内容?
- logging - 如何在 Jasmine 的 afterEach 中获取测试结果
- c# - 比较两个 JSON,如果需要,用默认数据填充一个
- flutter - DatabaseException(唯一约束失败:prop_mst.prop_id(代码 1555 SQLITE_CONSTRAINT_PRIMARYKEY))
- node.js - 如何使子HTTP请求nodejs
- java - 在 Oracle SQL 上运行的通用语句:使用 Java 的数据库