【发布时间】:2018-05-07 04:47:21
【问题描述】:
我目前正在开发一个项目,通过从 json 模式获取的路径从 Json 中检索值,因为我只想从 Json 获取 json 模式中存在的那些键的值。
我需要从中检索值的路径:
/array/0
/boolean
/null
/object/a
/object/c
/object/e
/number
/deep_nested_array/0/object_array1/0/key4
/deep_nested_array/0/object_array1/1/key5
/deep_nested_array/0/object_array1/2/key6
/object_array/0/key1
/object_array/1/key2
/object_array/2/key3
/string
我要从中检索值的 Json:
{
"array": [
1,
2,
3
],
"boolean": true,
"null": null,
"number": 123,
"object": {
"a": "b",
"c": "d",
"e": "f"
},
"string": "Hello World",
"object_array": [
{"key1": "value1" },
{"key2": "value2" },
{"key3": "value3" }
],
"deep_nested_array": [
{"object_array1": [
{"key4": "value4" },
{"key5": "value5" },
{"key6": "value6" }
]}
,
{"object_array2": [
{"key7": "value7" },
{"key8": "value8" },
{"key9": "value9" }
]}
]
}
我只想返回
[
1,
2,
3
]
true
null
b
d
f
123
Hello World
value1
value2
value3
value4
value5
value6
顺序取决于传递的路径,没关系。
我的代码
static string findValue(const Value &item, string path) {
StringBuffer s1;
Writer<StringBuffer> w1(s1);
item.Accept(w1);
cout << "recursing:" << s1.GetString() << endl;
cout << "Original Path:" << path << endl;
string delimiter = "/";
size_t pos = 1;
string token, paths;
token = path.substr(0, path.find(delimiter));
cout << "token:" << token << endl;
const Value &element = item[token.c_str()];
StringBuffer s;
Writer<StringBuffer> w(s);
element.Accept(w);
cout << "items matching the token:" << s.GetString() << endl;
while ((pos = path.find(delimiter)) <= path.find(delimiter)) {
paths = path.erase(0, pos + delimiter.length());
cout << "paths:" << paths << endl;
if (paths.length() > 1) {
if (element.IsObject()) {
findValue(element, paths);
} else if (element.IsArray()) {
for (SizeType i = 0; i < element.Size(); i++) {
if (element[i].IsArray() || element[i].IsObject()) {
findValue(element[i], paths);
} else {
cout << "Array returning:" << s.GetString() << endl;
return s.GetString();
}
}
}
} else {
cout << "item returningg:" << s.GetString() << endl;
return s.GetString();
}
}
}
我的输出
recursing:{"array":
[1,2,3],"boolean":true,"null":null,"number":123,"object":
{"a":"b","c":"d","e":"f"},"string":"Hello World","object_array":
[{"key1":"value1"},{"key2":"value2"},
{"key3":"value3"}],"deep_nested_array":[{"object_array1":
[{"key4":"value1"},{"key5":"value2"},{"key6":"value3"}]},
{"object_array2":[{"key7":"value4"},{"key8":"value5"},
{"key9":"value6"}]}]}
Original Path:array/
token:array
items matching the token:[1,2,3]
paths:
item returningg:[1,2,3]
recursing:{"array":
[1,2,3],"boolean":true,"null":null,"number":123,"object":
{"a":"b","c":"d","e":"f"},"string":"Hello World","object_array":
[{"key1":"value1"},{"key2":"value2"},
{"key3":"value3"}],"deep_nested_array":[{"object_array1":
[{"key4":"value1"},{"key5":"value2"},{"key6":"value3"}]},
{"object_array2":[{"key7":"value4"},{"key8":"value5"},
{"key9":"value6"}]}]}
Original Path:boolean/
token:boolean
items matching the token:true
paths:
item returningg:true
recursing:{"array":
[1,2,3],"boolean":true,"null":null,"number":123,"object":
{"a":"b","c":"d","e":"f"},"string":"Hello World","object_array":
[{"key1":"value1"},{"key2":"value2"},
{"key3":"value3"}],"deep_nested_array":[{"object_array1":
[{"key4":"value1"},{"key5":"value2"},{"key6":"value3"}]},
{"object_array2":[{"key7":"value4"},{"key8":"value5"},
{"key9":"value6"}]}]}
Original Path:null/
token:null
items matching the token:null
paths:
item returningg:null
recursing:{"array":
[1,2,3],"boolean":true,"null":null,"number":123,"object":
{"a":"b","c":"d","e":"f"},"string":"Hello World","object_array":
[{"key1":"value1"},{"key2":"value2"},
{"key3":"value3"}],"deep_nested_array":[{"object_array1":
[{"key4":"value1"},{"key5":"value2"},{"key6":"value3"}]},
{"object_array2":[{"key7":"value4"},{"key8":"value5"},
{"key9":"value6"}]}]}
Original Path:object/a/
token:object
items matching the token:{"a":"b","c":"d","e":"f"}
paths:a/
recursing:{"a":"b","c":"d","e":"f"}
Original Path:a/
token:a
items matching the token:"b"
paths:
item returningg:"b"
paths:
item returningg:{"a":"b","c":"d","e":"f"} //Dont need this to be
returned
recursing:{"array":
[1,2,3],"boolean":true,"null":null,"number":123,"object":
{"a":"b","c":"d","e":"f"},"string":"Hello World","object_array":
[{"key1":"value1"},{"key2":"value2"},
{"key3":"value3"}],"deep_nested_array":[{"object_array1":
[{"key4":"value1"},{"key5":"value2"},{"key6":"value3"}]},
{"object_array2":[{"key7":"value4"},{"key8":"value5"},
{"key9":"value6"}]}]}
Original Path:object/c/
token:object
items matching the token:{"a":"b","c":"d","e":"f"}
paths:c/
recursing:{"a":"b","c":"d","e":"f"}
Original Path:c/
token:c
items matching the token:"d"
paths:
item returningg:"d"
paths:
item returningg:{"a":"b","c":"d","e":"f"}
recursing:{"array":
[1,2,3],"boolean":true,"null":null,"number":123,"object":
{"a":"b","c":"d","e":"f"},"string":"Hello World","object_array":
[{"key1":"value1"},{"key2":"value2"},
{"key3":"value3"}],"deep_nested_array":[{"object_array1":
[{"key4":"value1"},{"key5":"value2"},{"key6":"value3"}]},
{"object_array2":[{"key7":"value4"},{"key8":"value5"},
{"key9":"value6"}]}]}
Original Path:object/e/
token:object
items matching the token:{"a":"b","c":"d","e":"f"}
paths:e/
recursing:{"a":"b","c":"d","e":"f"}
Original Path:e/
token:e
items matching the token:"f"
paths:
item returningg:"f"
paths:
item returningg:{"a":"b","c":"d","e":"f"}
recursing:{"array":
[1,2,3],"boolean":true,"null":null,"number":123,"object":
{"a":"b","c":"d","e":"f"},"string":"Hello World","object_array":
[{"key1":"value1"},{"key2":"value2"},
{"key3":"value3"}],"deep_nested_array":[{"object_array1":
[{"key4":"value1"},{"key5":"value2"},{"key6":"value3"}]},
{"object_array2":[{"key7":"value4"},{"key8":"value5"},
{"key9":"value6"}]}]}
Original Path:number/
token:number
items matching the token:123
paths:
item returningg:123
recursing:{"array":
[1,2,3],"boolean":true,"null":null,"number":123,"object":
{"a":"b","c":"d","e":"f"},"string":"Hello World","object_array":
[{"key1":"value1"},{"key2":"value2"},
{"key3":"value3"}],"deep_nested_array":[{"object_array1":
[{"key4":"value1"},{"key5":"value2"},{"key6":"value3"}]},
{"object_array2":[{"key7":"value4"},{"key8":"value5"},
{"key9":"value6"}]}]}
Original Path:deep_nested_array/object_array1/key4/
token:deep_nested_array
items matching the token:[{"object_array1":[{"key4":"value1"},
{"key5":"value2"},{"key6":"value3"}]},{"object_array2":[
{"key7":"value4"},{"key8":"value5"},{"key9":"value6"}]}]
paths:object_array1/key4/
recursing:{"object_array1":[{"key4":"value1"},{"key5":"value2"},
{"key6":"value3"}]}
Original Path:object_array1/key4/
token:object_array1
items matching the token:[{"key4":"value1"},{"key5":"value2"},
{"key6":"value3"}]
paths:key4/
recursing:{"key4":"value1"}
Original Path:key4/
token:key4
items matching the token:"value1"
paths:
item returningg:"value1"
recursing:{"key5":"value2"}
Original Path:key4/
token:key4
validationjson:
/home/mavericks/CLionProjects/validationjson/
include/rapidjson/document.h
:1137: rapidjson::GenericValue<Encoding, Allocator>&
rapidjson::GenericValue<Encoding, Allocator>::operator[](const
rapidjson::GenericValue<Encoding, SourceAllocator>&) [with
SourceAllocator
= rapidjson::MemoryPoolAllocator<>; Encoding = rapidjson::UTF8<>;
Allocator = rapidjson::MemoryPoolAllocator<>]: Assertion `false'
failed.
This error is because the for loop for the IsArray is continuing with
token 作为 key 4,path 作为 key4/ 而不是结束。 我们将不胜感激帮助解决这个问题。
【问题讨论】:
-
您的程序在什么时候没有按预期运行?你能提供一个minimal reproducible example吗?顺便说一句:如果这对您来说太大而无法管理,请考虑编写单元测试。他们会确保您在修复另一个地方时不会在一个地方弄坏东西。