UPDATE操作符在JQ中生成空对象 [英] Update operator yields empty object in JQ

查看:16
本文介绍了UPDATE操作符在JQ中生成空对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我无法理解以下示例中显示的JQ(1.6版)的更新操作符的行为。

为什么示例1返回更新的对象,而示例2和3返回空对象或错误的结果?

示例之间的区别只是将字符串转换为数字的函数的调用顺序不同。

#!/bin/bash
#
# strange behaviour jq

# example 1 - works as expected
jq -n '
  def numberify($x): $x | tonumber? // 0;

  "1" as $stringValue
  | numberify($stringValue) as $intValue
# | { }                                     # version 1: a.b does not exist yet
  | { a: { b: 1 } }                         # version 2: a.b exists already
  | .["a"] |= { b: (.b + $intValue) }
'
# result example 1, version 1 - expected
#   {
#     "a": {
#       "b": 1
#     }
#   }

# result example 1, version 2 - expected
#   {
#     "a": {
#       "b": 2
#     }
#   }


# example 2 - erroneous result
jq -n '
  def numberify($x): $x | tonumber? // 0;

  "1" as $stringValue
# | { }                           # version 1: a.b does not exist yet
  | { a: { b: 1 } }               # version 2: a.b exists already
  | .["a"] |= { b: (.b + numberify($stringValue)) }
'
# result example 2, version 1 - unexpected
#   {}

# result example 2, version 2 - unexpected
#   {}


# example 3 - erroneous result
jq -n '
  def numberify($x): $x | try tonumber catch 0;

  "1" as $stringValue
# | { }                           # version 1: a.b does not exist yet
  | { a: { b: 1 } }               # version 2: a.b exists already
  | .["a"] |= { b: (.b + numberify($stringValue)) }
'
# result example 3, version 1 - unexpected
#   {
#     "a": {
#       "b": 0
#     }
#   }

# result example 3, version 2 - unexpected
#   {
#     "a": {
#       "b": 1
#     }
#   }

@oguzismail使用‘+=’而不是‘|=’是个好主意。 我以前没想到这一点。 目前,我的错误解决方案代码如下所示:

  def numberify($x): $x | tonumber? // 0;

  "1" as $sumReqSize
  | "10" as $sumResSize
  | { statistics: { count: 1, sumReqSize: 2, sumResSize: 20 } }
  | [numberify($sumReqSize), numberify($sumResSize)] as $sizes     # workaround for bug
  | .statistics |= {
                     count: (.count + 1),
                     sumReqSize: (.sumReqSize + $sizes[0]),
                     sumResSize: (.sumResSize + $sizes[1])
                   }
'

按照您的建议,它会更简洁,不需要难看的解决方法:

  def numberify($x): $x | tonumber? // 0;

  "1" as $sumReqSize
  | "10" as $sumResSize
  | { statistics: { count: 1, sumReqSize: 2, sumResSize: 20 } }
  | .statistics.count += 1
  | .statistics.sumReqSize += numberify($sumReqSize)
  | .statistics.sumResSize += numberify($sumResSize)

推荐答案

这是JQ1.6中的一个错误。一种选择是使用较早版本的JQ(例如JQ 1.5)。

另一种方法是使用=来避免|=,大致如下:

.a = (.a | ...)

或者如果RHS实际上并不依赖于LHS(如您最初的示例所示),则只需将|=替换为=

这篇关于UPDATE操作符在JQ中生成空对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆