JSONPath
作者: cdaller创建于 2018年9月28日更新于 2025年2月7日
标签enhancement
// 解析 jsonPaths 如 $.foo[1].bar.baz[2][3].value (等于 foo[1].bar.baz[2][3].value) float parseJson(char *jsonString, char *jsonPath) { float jsonValue; DynamicJsonBuffer jsonBuffer;
JsonVariant root = jsonBuffer.parse(jsonString);
JsonVariant element = root;
if (root.success()) {
// 解析 jsonPath 并遍历 json 对象:
char pathElement[40];
int pathIndex = 0;
printf("parsing '%s'\n", jsonPath);
for (int i = 0; jsonPath[i] != '\0'; i++){
if (jsonPath[i] == '$') {
element = root;
} else if (jsonPath[i] == '.') {
if (pathIndex > 0) {
pathElement[pathIndex++] = '\0';
// printf("pathElement '%s'\n", pathElement);
pathIndex = 0;
element = element[pathElement];
if (!element.success()) {
printf("failed to parse key %s\n", pathElement);
}
}
} else if ((jsonPath[i] >= 'a' && jsonPath[i] <= 'z')
|| (jsonPath[i] >= 'A' && jsonPath[i] <= 'Z')
|| (jsonPath[i] >= '0' && jsonPath[i] <= '9')
|| jsonPath[i] == '-' || jsonPath[i] == '_'
) {
pathElement[pathIndex++] = jsonPath[i];
} else if (jsonPath[i] == '[') {
if (pathIndex > 0) {
pathElement[pathIndex++] = '\0';
// printf("pathElement '%s'\n", pathElement);
pathIndex = 0;
element = element[pathElement];
if (!element.success()) {
printf("failed in parsing key %s\n", pathElement);
}
}
} else if (jsonPath[i] == ']') {
pathElement[pathIndex++] = '\0';
int arrayIndex = strtod(pathElement, NULL);
// printf("index '%s' = %d\n", pathElement, arrayIndex);
pathIndex = 0;
element = element[arrayIndex];
if (!element.success()) {
printf("failed in parsing index %d\n", arrayIndex);
}
}
}
// 最后一个 token 如果有:
if (pathIndex > 0) {
pathElement[pathIndex++] = '\0';
// printf("pathElement '%s'\n", pathElement);
pathIndex = 0;
element = element[pathElement];
if (!element.success()) {
printf("failed in parsing key %s\n", pathElement);
}
}
// 解析 json 并返回值:
if (element.success()) {
jsonValue = element[0].asFloat();
} else {
jsonValue = 0.0f;
}
return jsonValue;
}
}
内容来源: bblanchon/ArduinoJson