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