我正在尝试向服务器发送 POST 请求,获取响应并解析它(它是一个 JSON 文件)。
我使用 Unirest 来处理我的 POST 请求,如下所示:
HttpResponse<JsonNode> response = Unirest
.post("http://myserver.com/file")
.header("cache-control", "no-cache")
.header("Postman-Token", "02ec2fa1-afdf-4a2a-a535-353424d99400")
.header("Content-Type", "application/json")
.body("{some JSON body}")
.asJson();
// retrieve the parsed JSONObject from the response
JSONObject myObj = response.getBody().getObject();
// extract fields from the object
String msg = myObj.toString();
System.out.println(msg);
Run Code Online (Sandbox Code Playgroud)
但我在获取原始 JSON 文本时遇到问题(我想用它JSONPath来解析响应)。
我怎样才能做到这一点?toString()到目前为止,我所有调用方法的尝试都失败了。
目前我需要根据配置处理一些 json 结果,而不是硬代码。
例如,json如下
{
data: [{
orderNo: "CG8310150",
details: [{
skuId: 4384,
amount: 2
}, {
skuId: 4632,
amount: 5
}]
}, {
orderNo: "CG8310151",
details: [{
skuId: 4384,
amount: 3
}]
}]
}
Run Code Online (Sandbox Code Playgroud)
我想要的结果如下
[{
orderNo: "CG8310150",
skuId: 4384,
amount: 2
}, {
orderNo: "CG8310150",
skuId: 4632,
amount: 5
}, {
orderNo: "CG8310151",
skuId: 4384,
amount: 3
}]
Run Code Online (Sandbox Code Playgroud)
如果有人有 Jayway JsonPath 的解决方案,或者有任何其他工具的建议,请告诉我。
感谢您的帮助!
我有这样的结构:
{"payload": {
"Item1": {
"property1": "Sunday",
"property2": "suffering_8890"
},
"Item2": {
"property1": "Monday",
"property2": "misery_0776"
},
"Item3": {
"property1": "Tuesday",
"property2": "pain_6756"
}
}
}
Run Code Online (Sandbox Code Playgroud)
我需要包含某个子字符串(即“misery”)的 property2 值。最终我只需要 4 位代码,但即使获得完整的值也可以。我可以使用以下方法获取所有 property2 值的列表:
$..property2
Run Code Online (Sandbox Code Playgroud)
这将返回:
Result[0] = suffering_8890
Result[1] = misery_0776
Result[2] = pain_6756
Run Code Online (Sandbox Code Playgroud)
如何过滤它,以便它只给出包含子字符串“misery”的结果?
假设 configmap 列出如下:
apiVersion: v1
kind: ConfigMap
metadata:
name: my-configmap
namespace: ${namespace}
data:
my-config.yaml: |-
keyA:
keyB: a-value
Run Code Online (Sandbox Code Playgroud)
如何使用命令从 configmap获取keyB(即) 的值?a-valuekubectl
PS:我正在考虑使用-o jsonpathor-o 'go-template=...选项,但我无法找出正确的语法。
完全改写问题,因为第一次尝试尚不清楚。
在我的逻辑应用程序中,我正在从 blob 读取 .json,其中包含:
{
"alpha": {
"url": "https://linktoalpha.com",
"meta": "This logic app does job aaaa"
},
"beta": {
"url": "https://linktobeta.com",
"meta": "This logic app does job beta"
},
"theta": {
"url": "https://linktotheta.com",
"meta": "This logic app does job theta"
}
}
Run Code Online (Sandbox Code Playgroud)
我使用正文中包含的 http 帖子触发逻辑应用程序:
{ "logicappname": "beta" }
Run Code Online (Sandbox Code Playgroud)
但“logicappname”的值可以是 alpha、beta 或 theta。我现在需要设置一个包含“beta”的 url 值的变量。如果没有 jsonpath 支持,如何实现这一点?
我已经使用 json 解析 blob 中的文件内容,这给了我令牌...但我不知道如何选择我需要的值。希望有任何帮助,谢谢。
jsonpath-ng包声称支持基本算术(https://pypi.org/project/jsonpath-ng/),但解析器不会接受算术语句。这是其中之一:
from jsonpath_ng import parse
jsonpath_expr = parse('$.objects[*].cow + $.objects[*].cat')
obj = {'objects': [
{'cow': 2, 'cat': 3},
{'cow': 4, 'cat': 6}
]}
values = [match.value for match in jsonpath_expr.find(obj)]
print(values)
Run Code Online (Sandbox Code Playgroud)
这会引发错误:
Traceback (most recent call last):
File "test.py", line 8, in <module>
jsonpath_expr = parse('$.objects[*].cow + $.objects[*].cat')
File "C:\Users\micha\AppData\Roaming\Python\Python38\site-packages\jsonpath_ng\parser.py", line 14, in parse
return JsonPathParser().parse(string)
File "C:\Users\micha\AppData\Roaming\Python\Python38\site-packages\jsonpath_ng\parser.py", line 32, in parse
return self.parse_token_stream(lexer.tokenize(string))
File "C:\Users\micha\AppData\Roaming\Python\Python38\site-packages\jsonpath_ng\parser.py", line 55, in parse_token_stream
return new_parser.parse(lexer = IteratorToTokenStream(token_iterator))
File "C:\Users\micha\AppData\Roaming\Python\Python38\site-packages\ply\yacc.py", line …Run Code Online (Sandbox Code Playgroud) 我正在寻找 json 文件中所有可能的 json 路径的列表 - 可以推荐任何一个吗?
例如:如果输入低于
{
"_id":{
"$oid":""
},
"aa":false,
"bb":false,
"source":"",
"email":"",
"createdAt":{
"$date":""
},
"updatedAt":{
"$date":""
},
"cc":"",
"vv":"",
"metadata":{
"vv":"",
"xx":[{}]
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
obj
obj._id
obj._id.$oid
obj.aa
obj.bb
obj.source
obj.email
obj.createdAt
obj.createdAt.$date
obj.updatedAt
obj.updatedAt.$date
obj.cc
obj.vv
obj.metadata
obj.metadata.vv
obj.metadata.xx
obj.metadata.xx[0]
Run Code Online (Sandbox Code Playgroud)
我基本都是在找 python 版本: https: //www.convertjson.com/json-path-list.htm
我想构建一个通用解决方案,如果有任何 json 文件 - 它将是模式生成的单个值(即换行符分隔的 json 中的一行)有什么建议吗?
我正在测试一个返回Map的控制器
@RequestMapping("/")
@ResponseBody
public Map<String, String> getMessages(@RequestBody String foo) {
Map<String, String> map = boo.getMap(foo);
return map;
}
Run Code Online (Sandbox Code Playgroud)
测试:
...
resultActions
.andDo(print())
.andExpect(status().isOk())
.andExpect(
content().contentTypeCompatibleWith(
MediaType.APPLICATION_JSON))
.andExpect(jsonPath("$", notNullValue()))
.andExpect(jsonPath(EXPRESSION, equalsTo(foo));
...
Run Code Online (Sandbox Code Playgroud)
我应该使用哪个表达式来读取Map中的键和值?
编辑:解决问题的方法可能是:
MvcResult result = resultActions.andReturn();
MockHttpServletResponse response = result.getResponse();
String content = response.getContentAsString();
Gson gson = new Gson();
Type typeOfT = new TypeToken<Map>() {
}.getType();
Map<String, String> map = gson.fromJson(content, typeOfT);
Run Code Online (Sandbox Code Playgroud)
然后遍历地图检查值.但有没有办法做到这一点jsonPath?
我的目标是读取一个JSON文件并理解所有值的位置,这样当我遇到相同的JSON时,我可以轻松读取所有值.我正在寻找一种方法来返回一个列表,其中包含Jayway JsonPath格式的每个数据值的所有路径.
示例JSON:
{
"shopper": {
"Id": "4973860941232342",
"Context": {
"CollapseOrderItems": false,
"IsTest": false
}
},
"SelfIdentifiersData": {
"SelfIdentifierData": [
{
"SelfIdentifierType": {
"SelfIdentifierType": "111"
}
},
{
"SelfIdentifierType": {
"SelfIdentifierType": "2222"
}
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想将JSON作为String,并执行以下操作:
String json = "{'shopper': {'Id': '4973860941232342', 'Context': {'CollapseOrderItems': false, 'IsTest': false } }, 'SelfIdentifiersData': {'SelfIdentifierData': [{'SelfIdentifierType': {'SelfIdentifierType': '111'} }, {'SelfIdentifierType': {'SelfIdentifierType': '2222'} } ] } }";
Configuration conf = Configuration.defaultConfiguration();
List<String> jsonPaths = JsonPath.using(conf).parse(json).read("$");
for (String path : jsonPaths) { …Run Code Online (Sandbox Code Playgroud) 我发现有点难以理解如何编写一个jsonpath来告诉我字段中是否存在某些值.
例如:考虑一下这个json:
{
"firstName": "John",
"lastName" : "doe",
"age" : 26,
"address" : {
"streetAddress": "naist street",
"city" : "Nara",
"postalCode" : "630-0192"
},
"phoneNumbers": [
{
"type" : "iPhone",
"number": "0123-4567-8888"
},
{
"type" : "home",
"number": "0123-4567-8910"
}
]
}
Run Code Online (Sandbox Code Playgroud)
如果我写:$ .phoneNumbers [?(@.type.length> 0)]
它给了我这个结果:
'0' ...
'type' => "iPhone"
'number' => "0123-4567-8888"
'1' ...
'type' => "home"
'number' => "0123-4567-8910"
Run Code Online (Sandbox Code Playgroud)
我这样做了:http://jsonpath.com/
因此,如果我想知道在phonenumber中的数字字段中是否有任何值,或者它是否为空,那么我的jsonpath应该是什么?我尝试了各种各样的东西,但无法理解.
谢谢!
jsonpath ×10
json ×6
java ×4
python ×2
azure ×1
go-templates ×1
hashmap ×1
jayway ×1
jmeter ×1
jq ×1
json-query ×1
jsonparser ×1
jsonpath-ng ×1
kubernetes ×1
mockmvc ×1
unirest ×1