有没有办法为嵌套的python词典定义XPath类型查询.
像这样的东西:
foo = {
'spam':'eggs',
'morefoo': {
'bar':'soap',
'morebar': {'bacon' : 'foobar'}
}
}
print( foo.select("/morefoo/morebar") )
>> {'bacon' : 'foobar'}
Run Code Online (Sandbox Code Playgroud)
我还需要选择嵌套列表;)
这可以通过@ jellybean的解决方案轻松完成:
def xpath_get(mydict, path):
elem = mydict
try:
for x in path.strip("/").split("/"):
try:
x = int(x)
elem = elem[x]
except ValueError:
elem = elem.get(x)
except:
pass
return elem
foo = {
'spam':'eggs',
'morefoo': [{
'bar':'soap',
'morebar': {
'bacon' : {
'bla':'balbla'
}
}
},
'bla'
]
}
print xpath_get(foo, "/morefoo/0/morebar/bacon")
Run Code Online (Sandbox Code Playgroud)
[编辑2016]这个问题和接受的答案是古老的.较新的答案可能比原始答案更好地完成工作.但是我没有测试它们所以我不会改变接受的答案.
有一个返回一个非常基本的json响应的服务:
{
"methodresult": "error",
"ErrorCode": 2,
"ErrorCodeText": "format",
"ErrorMessage": "Json parse exception at pos:171 msg:Expecting \"key\""
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用JSONPath来查询"methodresult"值是否返回"错误".
基于我见过的文档/示例,我希望这可以工作:
$[?(@.methodresult=="error")]
Run Code Online (Sandbox Code Playgroud)
但是基于我正在使用的验证器(https://jsonpath.curiousconcept.com/)我没有看到任何布尔响应.
当试图用一个不在数组中的东西写一个表达式时,我有什么东西不见了?
是否可以在JQ中使用相对路径或名称,如XPath //?
或者是否可以在JQ中使用通配符,如.level1.*.level3.element?
当尝试更改数组中的单个元素时,我得到Invalid path expression near attempt to access element- 但仅当数组从--rawInput.
例子:
# input: [ 1, 0 ]
. as $list | $list[0] = 30
# output: [ 30, 0 ]
Run Code Online (Sandbox Code Playgroud)
但这不起作用:
# input: 1,0
split(",") | map(tonumber) as $list | $list[0] = 30
# Invalid path expression near attempt to access element 0 of [1,0]
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我有一个与此类似的命令
kubectl get secrets \
--selector='my-selector' \
-o jsonpath='{range .items[*] }{"\n"}{.metadata.labels.cluster-name}{"."}{.metadata.namespace {":"}{"5432"}{"postgres" }{":"}{.data.password}{end}'
Run Code Online (Sandbox Code Playgroud)
它输出这样的列表(需要格式)
cluster-name.namespace:5432:postgres:YbHF....==
cluster-name.namespace:5432:postgres:YbHF....==
cluster-name.namespace:5432:postgres:YbHF....==
Run Code Online (Sandbox Code Playgroud)
我需要解码该文件的 base64 并使用kubectl 备忘单作为参考,其中给出了以下示例:
# Output decoded secrets without external tools
kubectl get secret my-secret -o go-template='{{range $k,$v := .data}}{{"### "}}{{$k}}{{"\n"}}{{$v|base64decode}}{{"\n\n"}}{{end}}'
Run Code Online (Sandbox Code Playgroud)
我尝试了以下方法
cluster-name.namespace:5432:postgres:YbHF....==
cluster-name.namespace:5432:postgres:YbHF....==
cluster-name.namespace:5432:postgres:YbHF....==
Run Code Online (Sandbox Code Playgroud)
结果是除了现在为空的密码字段之外的所有内容都显示出来,例如:
cluster-name.namespace:5432:postgres:
Run Code Online (Sandbox Code Playgroud)
任何指示将不胜感激。
我在 NiFi 中使用 EvaluateJsonPath 处理器来指定一个复合主键,用于将我的 JSON 数据写入 elasticsearch。我必须通过连接两个属性来创建一个名为“key”的属性,比如“attr1”和“attr2”。在 EvaluateJsonPath 配置中,我添加了一个值为“${attr1}${attr2}”的属性“key”(我使用这个键来避免 elasticsearch 中的冗余)。但是我收到了类似的错误:'key' is invalid 因为指定的表达式无效:${attr1}${attr2}。
使用 EvaluateJsonPath 处理器连接 json 记录中的 2 个属性的正确语法是什么?
我有以下 JSON:
{
"hits": {
"hits":[]
}
}
Run Code Online (Sandbox Code Playgroud)
(ElasticSearch 的一些回应)。
我想使用处理器EvaluateJsonPath来获取 的长度hits.hits。
我尝试了以下表达式:
$.hits.hits.length
但我收到以下错误:
FlowFile could not find path $['hits']['hits']['length'] for attribute key hits.:(这是错误的结束)。
然而,当使用 JsonEvaluate 网站在线检查时,它似乎有效。
我的表情怎么了?
假设我有一个 JSON 数据存储在varchar(max)数据库的列中。是否可以使用 SQL 获取该数据中存在的所有 JSON 路径。例如对于以下 JSON:
{
"dog":
{
"name":"Rover",
"age": 6,
"likes:["catch", "eating"]
}
}
Run Code Online (Sandbox Code Playgroud)
我会得到以下输出:
$.
$.dog
$.dog.name
$.dog.age
$.dog.likes[0]
$.dog.likes[1]
Run Code Online (Sandbox Code Playgroud)
我研究过包括json_queryand在内的函数json_value,但它们似乎更多的是从 JSON 获取数据,而不是我需要的元数据。
我正在使用 SQL Server 2018。
json ×3
apache-nifi ×2
jq ×2
jsonpath ×2
arrays ×1
base64 ×1
jmespath ×1
kubectl ×1
kubernetes ×1
python ×1
sql ×1
sql-server ×1
xpath ×1