首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用jq扁平化JSON数据

要使用 jq 扁平化 JSON 数据,可以根据具体的需求采用不同的方法。以下是几种常见的场景及其对应的解决方案:

1. 将嵌套对象展开为扁平结构

假设有以下嵌套的 JSON 数据:

代码语言:javascript
复制
json{
  "user": {
    "name": "张三",
    "address": {
      "city": "北京",
      "zip": "100000"
    },
    "emails": ["zhangsan@example.com", "zs@example.cn"]
  },
  "active": true
}

希望将其扁平化为:

代码语言:javascript
复制
json{
  "user.name": "张三",
  "user.address.city": "北京",
  "user.address.zip": "100000",
  "user.emails": ["zhangsan@example.com", "zs@example.cn"],
  "active": true
}

可以使用 jq 的递归函数来实现:

代码语言:javascript
复制
bashjq -r 'paths(scalars) as $path | { ($path | map(tostring) | join(".")): getpath($path) }' input.json

解释:​

  • paths(scalars):获取所有叶子节点的路径。
  • map(tostring) | join("."):将路径数组转换为点分隔的字符串。
  • getpath($path):根据路径获取对应的值。
  • 最终生成一个扁平化的对象。

注意:​​ 这种方法适用于简单的扁平化需求,但对于复杂的嵌套结构可能需要更复杂的处理。

2. 将嵌套数组展开为扁平列表

假设有以下包含嵌套数组的 JSON 数据:

代码语言:javascript
复制
json{
  "users": [
    {
      "name": "张三",
      "emails": ["zhangsan@example.com", "zs@example.cn"]
    },
    {
      "name": "李四",
      "emails": ["lisi@example.com"]
    }
  ]
}

希望将其扁平化为:

代码语言:javascript
复制
json[
  { "user.name": "张三", "user.emails[0]": "zhangsan@example.com", "user.emails[1]": "zs@example.cn" },
  { "user.name": "李四", "user.emails[0]": "lisi@example.com" }
]

可以使用 jq 的递归展开功能:

代码语言:javascript
复制
bashjq '.users[] | with_entries(.key |= "user." + .) | flatten' input.json

不过,更通用的方法是使用递归函数来处理任意深度的嵌套:

代码语言:javascript
复制
bashjq '
  def flatten:
    reduce paths(scalars) as $path ({}; . + { ($path | map(tostring) | join(".")): getpath($path) });

  .users[] | flatten
' input.json

但为了更好地处理数组索引,可以使用如下方法:

代码语言:javascript
复制
bashjq '
  def flatten:
    if type == "object" then
      map_values(flatten) | with_entries(.key |= "user." + .)
    elif type == "array" then
      map(flatten) | .[]
    else
      .
    end;

  .users[] | flatten
' input.json

更简洁的方法:​

如果只是想将数组元素展开为单独的对象,可以使用 jqmapto_entries

代码语言:javascript
复制
bashjq '.users[] | {user: {name: .name, emails: .emails}}' input.json

但对于更复杂的扁平化需求,建议使用递归函数。

3. 使用递归函数进行深度扁平化

以下是一个通用的递归扁平化函数,适用于各种嵌套结构:

代码语言:javascript
复制
bashjq '
  def flatten:
    if type == "object" then
      reduce keys[] as $k ({}; . + { ($k): (getpath([$k]) | flatten) })
    elif type == "array" then
      map(flatten) | flatten
    else
      .
    end;

  flatten
' input.json

使用示例:​

假设有以下 JSON 数据:

代码语言:javascript
复制
json{
  "a": 1,
  "b": {
    "c": 2,
    "d": [3, 4, {"e": 5}]
  },
  "f": [6, {"g": 7}]
}

应用上述 flatten 函数后,输出将为:

代码语言:javascript
复制
json{
  "a": 1,
  "b.c": 2,
  "b.d[0]": 3,
  "b.d[1]": 4,
  "b.d[2].e": 5,
  "f[0]": 6,
  "f[1].g": 7
}

4. 综合示例

假设有以下 JSON 数据 input.json

代码语言:javascript
复制
json{
  "id": 1,
  "details": {
    "name": "张三",
    "contact": {
      "phone": "1234567890",
      "email": "zhangsan@example.com"
    }
  },
  "roles": ["admin", "user"]
}

要将其扁平化为:

代码语言:javascript
复制
json{
  "id": 1,
  "details.name": "张三",
  "details.contact.phone": "1234567890",
  "details.contact.email": "zhangsan@example.com",
  "roles[0]": "admin",
  "roles[1]": "user"
}

可以使用以下 jq 命令:

代码语言:javascript
复制
bashjq '
  def flatten:
    if type == "object" then
      reduce keys[] as $k ({}; . + { ($k): (getpath([$k]) | flatten) })
    elif type == "array" then
      map(flatten) | flatten
    else
      .
    end;

  flatten
' input.json

输出结果:​

代码语言:javascript
复制
json{
  "id": 1,
  "details.name": "张三",
  "details.contact.phone": "1234567890",
  "details.contact.email": "zhangsan@example.com",
  "roles[0]": "admin",
  "roles[1]": "user"
}
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

使用jq处理JSON数据(三)

前情提要: 使用jq处理JSON数据(一) 使用jq处理JSON数据(二) 今天,我来分享一下jq工具最后的一部分内容:文件格式转换。 jq工具可以从JSON到CSV的简单转换。..."ApiTest" } { "author": "tester2", "title": "performanceTest" } 这里我们得到了一组JSON数据,而不是使用.artworks(不带...Part2组装数据 那么接下来,需要将这些JSON对象转换为数组。这里用到之前学到的组合管道符和函数中的语法:增加一个管道符,处理每一个JSON对象数据。..., "ApiTest" ] [ "tester2", "performanceTest" ] 新的过滤器[.author,.title]处理返回的JSON数据,获取到JSON数据中key是..."" 这里看到里面的分号是转义的,这是由于jq默认情况下将JSON编码应用于其输出。

3.1K60

使用jq处理JSON数据(二)

之前的文章使用jq处理JSON数据(一)中,我分享了jq工具的基本用法。今天开始分享jq的高阶使用,包括管道符、函数以及格式转换。...管道符和函数 在这个章节中中,将分享jq更多过滤JSON数据的方法。 使用|运算符,我们可以结合两个过滤器。它的工作原理与Unix系统管道符类似。左边的过滤器的输出传递到右边的过滤器。...请注意:.name.first与.name | .first使用结果是完全相同的,就将JSON数据中.name节点数据传递到第二个过滤器,然后选择.first。 管道可以跟其他功能组合。...例如,我们可以使用keys函数来获取JSON数据某个节点的键集合: ✘ fv@FunTester  ~/Downloads  cat FunTester.json | jq '. | keys'...转换格式 这个章节,我将分享一些使用jq将原来JSON数据组合转换其他格式的技巧。

3.5K30
  • 使用jq处理JSON数据(一)

    在平常的工作中,遇到的接口响应格式绝大多数都是JSON格式,对于这种格式的数据有时候又爱又恨。很多时候要看懂层级,很多人会使用一些格式化工具(包括在线工具)。...在本文中,我们将学习如何使用jq命令行优雅地处理JSON格式数据。 jq可在各种平台上运行,可用于Linux、Windows和Mac OS。...如下: FunTester:~ fv$ echo '{"name":"FunTester"}' | jq { "name": "FunTester" } 没有任何参数,jq只是输出JSON输入数据...jq默认情况下输出格式的JSON。我们可以将少量的JSON数据通过管道传递给jq并获得格式正确的输出。 jq可以使用一个或多个过滤器作为参数。最简单的过滤器是.。...这是一个jq常见用法,我用moco API封装框架,将上面的JSON数据当做一个接口的响应。

    2.7K10

    JSON神器之jq使用指南指北

    jq 是一个轻量级且灵活的命令行 JSON 处理器。 jq 就像sedJSON 数据一样 - 您可以使用它来切片、过滤、映射和转换结构化数据,就像 ,sed和 朋友让您玩文本一样容易。...这在将 jq 用作简单的计算器或从头构建 JSON 数据时很有用。 --compact-output/ -c: 默认情况下,jq 漂亮地打印 JSON 输出。...类型和值 jq 支持与 JSON 相同的数据类型集 - 数字、字符串、布尔值、数组、对象(在 JSON 中是只有字符串键的散列)和“null”。...此时 jq 只使用元数据的“搜索”键/值。元数据也通过 modulemeta内置提供给用户。...“.json”后缀将添加到相对路径字符串中。该文件的数据将以$NAME::NAME. 可选元数据必须是常量 jq 表达式。它应该是一个带有“主页”等键的对象。此时 jq 只使用元数据的“搜索”键/值。

    28.7K30

    关于使用jq 处理json格式的简单笔记

    json格式包含有如下的基本类型: 数字,字符串,false, true, null 而由基本类型组成的复合类型有: 数组,对象;其中数组是以 [ ] 进行标记的,而对象是以 { } 进行标记; jq...这个命令用来处理json数据格式,非常方便,简单记录其常用的使用方法如下: A....如果 jq 要处理的json是 数组类型,那么用 “jq .[ ]” 可以将数组的最外层的[ ] 标记脱掉, 从而变成 对象 类型。 2)....例如: [root@localhost Desktop]# cat t | jq .[0] #获得的结果是一个json 对象....其他使用小tips: 在可以使用 .key1.key2 这种情况下,也可以使用 .key1|.key2 的格式,个人更倾向于使用 .key1|.key2 ,因为看起来更清晰明了. 比如下面的例子.

    7K10

    如何使用 jq 接收 blob 数据

    如何使用 jq 接收 blob 数据 ⭐️ 更多前端技术和知识点,搜索订阅号 JS 菌 订阅 目前 jq 用的人还是挺多的,在一些简单的促销 h5 页面,用 jq 去实现一些简单的功能还是比较方便的。...本文展示如何用 JQ 去请求一个 blob 对象的 img 图片并渲染到页面上 默认 jq 的 ajax 对象中的 dataType 无法设置返回资源为 blob 那么就需要手动设置,使其能够最终请求一个...blob 对象 解决办法: 使用原生 XMLHttpRequest var xhr = new XMLHttpRequest() xhr.onreadystatechange = function...} } xhr.open('GET', 'https://httpbin.org/image/png') xhr.responseType = 'blob' xhr.send() 这种方法直接使用了原生的...ajax 另外还可以使用 xhr 或 xhrFields 配置来修改返回资源的类型 重写 xhr jq 的 ajax 方法提供了一个 xhr 属性,可以自由定义 xhr jQuery.ajax({

    3.4K30

    jq使用建议

    前言 我们在一些陈旧或者传统mvc的项目中还是会经常使用jq,但是由于对jq api或者核心思想不熟悉,导致我们的某些写法并不是特别好,这里会摘录一些一些并给出大家更好的写法建议。...选择元素 选择器使用 尽量使用综合查询效率最高的,一般id以及元素选择是最高效的,其实是class,最差的是属性选择器以及伪类选择器。...原理也很简单,在任何一个jq方法结束其操作之后都会重新返回其jq对象。我们找到源码部分:jq的show(),hide()方法,可以看到其最后会把原生对象重新返回。...class2') //建议,添加以及移除样式可以支持多个,空格隔开即可 $(".demo1").addClass('class1 class2').removeClass("class1 class2") 数据存储与使用...我们都知道jq封装了针对数据使用的.data(key,value)方法,也知道其有工具方法$.data(ele,key,value),建议使用工具函数因为其定义在原生对象原型链,操作效率更高 //不建议

    1.8K10

    json命令行处理神器jq介绍

    这就是jq命令行工具的亮点所在。   jq是一款强大而高效的JSON处理工具,它能让你在命令行中轻松地过滤、转换和操作JSON数据。...在这篇文章中,我们将深入探讨jq的使用方法,从基础操作到高级技巧,帮助你成为JSON数据处理的专家。无论你是初学者还是有经验的程序员,本文都能为你提供有价值的见解和实用技巧。...在终端中运行以下命令即可安装: brew install jq   安装完成后,我们就可以开始使用jq来处理JSON数据了。让我们从一些基本的操作开始,逐步深入了解jq的强大功能。...数组操作 使用 [] 来操作数组。jq提供了多种方式来处理JSON数组: 索引访问:使用 .[index] 来访问特定索引的元素。例如,.[0] 获取第一个元素。 切片:使用 ....过滤   使用 select 函数进行过滤是jq的一个强大特性。select 函数允许我们基于特定条件从JSON数据中筛选出所需的元素。

    11710

    linux下解析json格式的jq工具

    linux下解析json格式的jq工具 第一章 jq入门 1、linux下jq工具的安装 vim中使用jq工具 第二章 linux下jq工具的基本使用 1、检查json文件的格式的合法性 2、显示json...文件的所有内容 3、通过Key获取Value的值 4、嵌套解析 5、内建函数 6、jq使用的参考链接 linux下解析json格式的jq工具 jq工具会把json文件更有好的读取出来,此外,jq工具还在背后检查...json文件的合法性,如果文件存在格式上的错误,jq也会报出错误存在的位置 第一章 jq入门 1、linux下jq工具的安装 sudo apt-get install jq -y vim中使用jq工具...注意提前备份json文件,因为该操作会直接修改文件 在vim的最后一行模式下使用 :%!...第二章 linux下jq工具的基本使用 1、检查json文件的格式的合法性 如果该json文件存在格式错误,会报出错误存在的位置,如: "url" parse error: Expected string

    3.9K10

    使用JSONPath解析json数据

    之前学习爬虫的时候,如果是 HTML 的数据,通过 xpath 或是 css 选择器,就能很快的获取我们想要的数据,如果是 json 有没有类似 xpath 这种,能够直接根据条件定位数据,而不需要自行...json 解析在遍历获取。...匹配所有对象或元素. [] 下标运算符,JsonPath 索引从 0 开始. [,] 连接运算符,将多个结果拼成数组返回,JSONPath 允许使用别名....json 遍历呢,下面我列举一个是我实战中遇到的例子(实际上这样的例子特别多),我先把部分数据展示出来(删除部分没用到的参数,实际参数远比这多),然后通过 js 遍历,以及 jsonpath 来获取我想要的数据...也许是我的搜索方式有问题,但千篇一律都是 js 如何解析多层 json,以及遍历所有的子元素,虽然这些办法确实能解决我的问题,但每次遇到这种数据,都需要花上长时间去编写对应的逻辑。

    2.6K30
    领券