我正在try 将一个大的JSON从Excel到JSON的转换重新格式化为一个有效的JSON以供导入. 在我的研究中,我遇到了jq,希望有更深入的人可以帮助我.

我有一大群像这样的员工

{
  "Employees": [
    {
      "firstName": "First",
      "lastName": "Last",
      "birthday": "1990-01-01",
      "account": "true",
      "address.street": "Street",
      "address.addition": "1",
      "address.zipCode": "1000",
      "address.city": "Vienna",
      "address.region": "AT",
      "contactDetails.1.phone": "+431234567",
      "contactDetails.1.mail": "first.last@mail.com",
      "organisations.0.id": 1,
      "departments.0.id": 1,
      "roles.0.id": 1
    },
  ]
}

每个员工的输出应如下所示

{
  "Employees": [
    {
      "firstName": "First",
      "lastName": "Last",
      "birthday": "1990-01-01",
      "account": "true",
      "address": {
        "street": "Street",
        "addition": "1",
        "zipCode": "1000",
        "city": "Vienna",
        "region": "AT"
      },
      "contactDetails": [
        {
          "phone": "",
          "mail": ""
        },
        {
          "phone": "+431234567",
          "mail": "first.last@mail.com"
        }
      ],
      "organisations": [
        {
          "id": 1
        }
      ],
      "departments": [
        {
          "id": 1
        }
      ],
      "roles": [
        {
          "id": 1
        }
      ]
    }
  ]
}

JQ有可能做到这一点吗?或者有什么 idea 可以实现这一点吗?

推荐答案

下面是一种使用to_entries访问键和值的方法..key/分割成点,看起来像数字的部分被转换成表示数组索引的数字,并用作将.value设置为setpath的路径.使用reduce迭代为.Employees数组中的每一项连续构建结果对象.唯一需要注意的是,.contactDetails数组中的第0项(未在输入数据中寻址,但需要包含更高的索引)不会自动填充其sibling 项的键(以及必须单独提供的空字符串值,即{"phone": "", "mail": ""}).

.Employees[] |= (
  reduce to_entries[] as $e (null;
    setpath($e.key / "." | map(tonumber? // .); $e.value)
  )
)
{
  "Employees": [
    {
      "firstName": "First",
      "lastName": "Last",
      "birthday": "1990-01-01",
      "account": "true",
      "address": {
        "street": "Street",
        "addition": "1",
        "zipCode": "1000",
        "city": "Vienna",
        "region": "AT"
      },
      "contactDetails": [
        null,
        {
          "phone": "+431234567",
          "mail": "first.last@mail.com"
        }
      ],
      "organisations": [
        {
          "id": 1
        }
      ],
      "departments": [
        {
          "id": 1
        }
      ],
      "roles": [
        {
          "id": 1
        }
      ]
    }
  ]
}

Demo

Json相关问答推荐

手动解开没有可编码的SON- Swift

创建Json嵌套文件 struct

如何将文件夹组织的.json文件合并为一个JSON文件,文件夹/文件名作为键

如果主对象中已存在属性,则不应在Jolt中引用次对象

(Kotlin)com.google.gson.internal.LinkedTreeMap无法转换为com.example.phonetest2.model.HallData

导致此 Kotlin Retrofit2 错误的可能原因有哪些?

Golang jsonrpc2 服务器在哪里监听?

将带有::text[]的JSON数组转换未按预期工作

jq - 仅在键值对存在的地方打印值

使用 jolt 将对象数组转换为数组

使用 serde 和 csv crates 将嵌套的 json 对象序列化为 csv

修改 boost::json::object 中的值

使用杰克逊解析Kotlin 中的通用密封类

如何实现一个通用的 serde_json::from_str

如何在 Eclipse 中安装和使用 JSON 编辑器?

Laravel5 Json 获取文件内容

在浏览器中查看 JSON 文件

JSON日期到Java日期?

从 JSON 中 Select 不同的值

为什么 RestTemplate 不将响应表示绑定到 PagedResources?