我正在寻找将 JSON 转换为 CSV 的解决方案。似乎大多数解决方案都希望 JSON 是单个对象而不是对象数组。
我从这里尝试过的所有解决方案似乎都与我的输入不同,这些输入来自curling this site。
jq
当输入是数组而不是对象时,如何使用或其他工具将 JSON 转换为 CSV 。
[
{
"id": "4",
"link": "https://pressbooks.online.ucf.edu/amnatgov/",
"metadata": {
"@context": "http://schema.org",
"@type": "Book",
"name": "American Government",
"inLanguage": "en",
"copyrightYear": "2016",
"disambiguatingDescription": "The content of this textbook has been developed and arranged to provide a logical progression from the fundamental principles of institutional design at the founding, to avenues of political participation, to thorough coverage of the political structures that constitute American government. The book builds upon what students have already learned and emphasizes connections between topics as well as between theory and applications. The goal of each section is to enable students not just to recognize concepts, but to work with them in ways that will be useful in later courses, future careers, and as engaged citizens. ",
"image": "https://pressbooks.online.ucf.edu/app/uploads/sites/4/2020/01/American-Government.png",
"isBasedOn": "https://ucf-dev.pb.unizin.org/pos2041",
"author": [
{
"@type": "Person",
"name": "OpenStax"
}
],
"datePublished": "2016-01-06",
"copyrightHolder": {
"@type": "Organization",
"name": "cnxamgov"
},
"license": {
"@type": "CreativeWork",
"url": "https://creativecommons.org/licenses/by/4.0/",
"name": "CC BY (Attribution)"
}
},
"_links": {
"api": [
{
"href": "https://pressbooks.online.ucf.edu/amnatgov/wp-json/"
}
],
"metadata": [
{
"href": "https://pressbooks.online.ucf.edu/amnatgov/wp-json/pressbooks/v2/metadata"
}
],
"self": [
{
"href": "https://pressbooks.online.ucf.edu/wp-json/pressbooks/v2/books/4"
}
]
}
}
]
所需格式:
id, link, context, type, name, inLanguage, image, author_type, author_name, license_type, license_url, license_name
问题并不是您显示的 JSON 是一个数组,而是数组的每个元素(您只有一个)都是一个相当复杂的结构。直接将每个数组条目中的相关数据提取到一个较短的平面数组中,然后使用
@csv
in将其转换为 CSVjq
:...但请注意我是如何被迫决定我们只对第一作者感兴趣(
.metadata.author
子结构是一个数组)。输出:
要创建作为所有作者姓名串联的作者姓名字符串(对于作者类型也是如此),使用
;
分隔符,您可以代替.metadata.author[0].name
上述使用[.metadata.author[].name]|join(";")
(和[.metadata.author[]."@type"]|join(";")
类型),以便您的命令变为使用 Miller ( https://github.com/johnkerl/miller ) 你可以“扁平化” JSON,运行
然后提取您想要的字段并使用重命名它们
输出将是