【问题标题】:jq set a property in a json to an integer valuejq 将 json 中的属性设置为整数值
【发布时间】:2020-06-22 13:45:52
【问题描述】:

我有一个 json,其中包含

"memoryConfiguration" : {
    "optimizeMemorySettingsOnSave" : true,
    "availableMemory" : "30167040",
    "sharedBuffers" : 209715,
    "workMem" : 4194,
    "effectiveCacheSize" : 786432,
    "maintenanceWorkMem" : 65536
  },

我需要将 availableMemory 设置更改为一个整数,使其看起来像这样:

  "memoryConfiguration" : {
    "optimizeMemorySettingsOnSave" : true,
    "availableMemory" : 30167040,
    "sharedBuffers" : 209715,
    "workMem" : 4194,
    "effectiveCacheSize" : 786432,
    "maintenanceWorkMem" : 65536
  },

我的脚本(在 bash 中)将其设置为字符串(带双引号):

SETMEM=200000 jq --raw-output --arg MyMemSetting $SETMEM '.memoryConfiguration.availableMemory=$MyMemSetting'  my_json_file.json

我知道有一个|tonumber 可用,但在设置属性时似乎无法弄清楚让它工作的语法。

有什么帮助吗?

【问题讨论】:

标签: json integer jq numeric


【解决方案1】:

所以这是一个 bash 问题:

看看这个例子

 A=10    echo "="${A}"="

使用此语法,A 是在 echo 进程的子shell 中定义的,而不是当前的

 B=20  ;  echo "="${B}"="

带有';' , 你将有 2 个不同的语句, 所以定义变量, 另一个将使用

【讨论】:

    【解决方案2】:

    发布的问题引发了以下两个可能的解决方案中解决的几个问题。

    1. 要使用MEMSET=... jq ... 样式达到预期效果,可以这样写:
    MEMSET=200000 jq '
       .memoryConfiguration.availableMemory=(env.MEMSET|tonumber)
    '  my_json_file.json
    

    虽然这有一个警告(见下文)。注意 bash 变量的值是一个字符串。

    1. 要将整数值作为 JSON 数字传递,请使用 --argjson 而不是 --arg:
    MEMSET=200000
    jq --argjson MyMemSetting "$SETMEM" '
      .memoryConfiguration.availableMemory=$MyMemSetting
    ' my_json_file.json
    

    下面描述的警告也适用于这种情况。

    警告

    jq 的所有官方版本(直到 1.6 版)都有一个众所周知的“精度损失”问题,这是由于使用 IEEE 754 64 位数字来表示 JSON 数字而导致的。 2019 年 10 月 22 日(即 jq 1.6 发布之后)进行的更新解决了表示问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-20
      • 1970-01-01
      相关资源
      最近更新 更多