我最初对JSON (让我们称之为"raw_data.json")有一个问题,它看起来如下所示:
[
  {
    "metadata": {
      "project": [
        "someProject1",
        "someProject2"
      ],
      "table_name": [
        "someTable1",
        "someTable2"
      ],
      "sys_insertdatetime": "someDate",
      "sys_sourcesystem": "someSourceSystem"
    },
    "data": {
      "field1": 63533712,
      "field2": "",
      "field3": "hello",
      "field4": "other",
      "field5": 2022,
      "field6": "0",
      "field7": "0",
      "field8": "0",
      "field9": "0",
      "field10": "0",
      "field11": "0"
    }
  },
  {
    "metadata": {
      "project": [
        "someProject1",
        "someProject2"
      ],
      "table_name": [
        "someTable1",
        "someTable2"
      ],
      "sys_insertdatetime": "someDate",
      "sys_sourcesystem": "someSourceSystem"
    },
    "data": {
      "field1": 63533713,
      "field2": "Y2JjLTIwMjItdzA1LXRyZi1vZmZyZXMtcmVuZm9ydC1jaGVxdWllci13MDU=",
      "field3": "A0AVB",
      "field4": "other",
      "field5": "HJlbmZvcnQgY2hlcXVpZXIgVzA1",
      "field6": "",
      "field7": "02/02/2022",
      "field8": "14/02/2022",
      "field9": "Ticket"
    }
  }
]字典很大,通常跨越我显示器上的几行。这是一个问题,因为我需要在Base64中对整个过程进行编码,并使用HTTP方法发送结果。但是编码倾向于通过添加换行符来包装行,这导致了my POST方法失败。
幸运的是,我找到了一个具有以下解决方案的问题:
export DATA=$(cat 'raw_data.json')
export ENCODED_DATA=$(echo "$DATA" | jq -c . | base64 -w 0)问题是,我的JSON现在已经改为:
{
  "request_id": 1234,
  "data_to_be_encoded": [
    {
      "metadata": {
        "project": [
          "someProject1",
          "someProject2"
        ],
        "table_name": [
          "someTable1",
          "someTable2"
        ],
        "sys_insertdatetime": "someDate",
        "sys_sourcesystem": "someSourceSystem"
      },
      "data": {
        "field1": 63533712,
        "field2": "",
        "field3": "hello",
        "field4": "other",
        "field5": 2022,
        "field6": "0",
        "field7": "0",
        "field8": "0",
        "field9": "0",
        "field10": "0",
        "field11": "0"
      }
    },
    {
      "metadata": {
        "project": [
          "someProject1",
          "someProject2"
        ],
        "table_name": [
          "someTable1",
          "someTable2"
        ],
        "sys_insertdatetime": "someDate",
        "sys_sourcesystem": "someSourceSystem"
      },
      "data": {
        "field1": 63533713,
        "field2": "Y2JjLTIwMjItdzA1LXRyZi1vZmZyZXMtcmVuZm9ydC1jaGVxdWllci13MDU=",
        "field3": "A0AVB",
        "field4": "other",
        "field5": "HJlbmZvcnQgY2hlcXVpZXIgVzA1",
        "field6": "",
        "field7": "02/02/2022",
        "field8": "14/02/2022",
        "field9": "Ticket"
      }
    }
  ]
}基本上,我需要保持request_id键值对的原样,而data_to_be_encoded密钥中的内容必须进行编码。同样,另一个帖子提供了一个很好的解决方案:
export DATA=$(cat 'raw_data.json')
export ENCODED_DATA=$(echo "$DATA" | jq '.data_to_be_encoded |= @base64')除了这个解决方案增加了行包装之外,我还没有找到像第一个解决方案那样禁用该功能的方法。
我试过这个:
export ENCODED_DATA=$(echo "$DATA" | jq -c .data_to_be_encoded | base64 -w 0)但是它只返回data_to_be_encoded键内的值,而不是整个JSON。所以我又回到原点了。
我怎样才能在这两个世界中发挥最大的作用?换句话说,如何在同时编码JSON的特定部分的同时禁用行包装?
发布于 2022-02-15 16:13:40
使用jq的@base64内置,而不是在外部进行转换,因为这样您可以转换所有或根本不转换。
jq '.data_to_be_encoded |= @base64'{
  "request_id": 1234,
  "data_to_be_encoded": "W3sibWV0YWRhdGEiOnsicHJvamVjdCI6WyJzb21lUHJvamVjdDEiLCJzb21lUHJvamVjdDIiXSwidGFibGVfbmFtZSI6WyJzb21lVGFibGUxIiwic29tZVRhYmxlMiJdLCJzeXNfaW5zZXJ0ZGF0ZXRpbWUiOiJzb21lRGF0ZSIsInN5c19zb3VyY2VzeXN0ZW0iOiJzb21lU291cmNlU3lzdGVtIn0sImRhdGEiOnsiZmllbGQxIjo2MzUzMzcxMiwiZmllbGQyIjoiIiwiZmllbGQzIjoiaGVsbG8iLCJmaWVsZDQiOiJvdGhlciIsImZpZWxkNSI6MjAyMiwiZmllbGQ2IjoiMCIsImZpZWxkNyI6IjAiLCJmaWVsZDgiOiIwIiwiZmllbGQ5IjoiMCIsImZpZWxkMTAiOiIwIiwiZmllbGQxMSI6IjAifX0seyJtZXRhZGF0YSI6eyJwcm9qZWN0IjpbInNvbWVQcm9qZWN0MSIsInNvbWVQcm9qZWN0MiJdLCJ0YWJsZV9uYW1lIjpbInNvbWVUYWJsZTEiLCJzb21lVGFibGUyIl0sInN5c19pbnNlcnRkYXRldGltZSI6InNvbWVEYXRlIiwic3lzX3NvdXJjZXN5c3RlbSI6InNvbWVTb3VyY2VTeXN0ZW0ifSwiZGF0YSI6eyJmaWVsZDEiOjYzNTMzNzEzLCJmaWVsZDIiOiJZMkpqTFRJd01qSXRkekExTFhSeVppMXZabVp5WlhNdGNtVnVabTl5ZEMxamFHVnhkV2xsY2kxM01EVT0iLCJmaWVsZDMiOiJBMEFWQiIsImZpZWxkNCI6Im90aGVyIiwiZmllbGQ1IjoiSEpsYm1admNuUWdZMmhsY1hWcFpYSWdWekExIiwiZmllbGQ2IjoiIiwiZmllbGQ3IjoiMDIvMDIvMjAyMiIsImZpZWxkOCI6IjE0LzAyLzIwMjIiLCJmaWVsZDkiOiJUaWNrZXQifX1d"
}如果需要全部放在一行中,请像前面一样使用-c选项:
jq -c '.data_to_be_encoded |= @base64'{"request_id":1234,"data_to_be_encoded":"W3sibWV0YWRhdGEiOnsicHJvamVjdCI6WyJzb21lUHJvamVjdDEiLCJzb21lUHJvamVjdDIiXSwidGFibGVfbmFtZSI6WyJzb21lVGFibGUxIiwic29tZVRhYmxlMiJdLCJzeXNfaW5zZXJ0ZGF0ZXRpbWUiOiJzb21lRGF0ZSIsInN5c19zb3VyY2VzeXN0ZW0iOiJzb21lU291cmNlU3lzdGVtIn0sImRhdGEiOnsiZmllbGQxIjo2MzUzMzcxMiwiZmllbGQyIjoiIiwiZmllbGQzIjoiaGVsbG8iLCJmaWVsZDQiOiJvdGhlciIsImZpZWxkNSI6MjAyMiwiZmllbGQ2IjoiMCIsImZpZWxkNyI6IjAiLCJmaWVsZDgiOiIwIiwiZmllbGQ5IjoiMCIsImZpZWxkMTAiOiIwIiwiZmllbGQxMSI6IjAifX0seyJtZXRhZGF0YSI6eyJwcm9qZWN0IjpbInNvbWVQcm9qZWN0MSIsInNvbWVQcm9qZWN0MiJdLCJ0YWJsZV9uYW1lIjpbInNvbWVUYWJsZTEiLCJzb21lVGFibGUyIl0sInN5c19pbnNlcnRkYXRldGltZSI6InNvbWVEYXRlIiwic3lzX3NvdXJjZXN5c3RlbSI6InNvbWVTb3VyY2VTeXN0ZW0ifSwiZGF0YSI6eyJmaWVsZDEiOjYzNTMzNzEzLCJmaWVsZDIiOiJZMkpqTFRJd01qSXRkekExTFhSeVppMXZabVp5WlhNdGNtVnVabTl5ZEMxamFHVnhkV2xsY2kxM01EVT0iLCJmaWVsZDMiOiJBMEFWQiIsImZpZWxkNCI6Im90aGVyIiwiZmllbGQ1IjoiSEpsYm1admNuUWdZMmhsY1hWcFpYSWdWekExIiwiZmllbGQ2IjoiIiwiZmllbGQ3IjoiMDIvMDIvMjAyMiIsImZpZWxkOCI6IjE0LzAyLzIwMjIiLCJmaWVsZDkiOiJUaWNrZXQifX1d"}https://stackoverflow.com/questions/71128689
复制相似问题