当前位置: 首页 > article >正文

jsmn输出

对应c程序:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "jsmn.h"

#define my_printf(format, ...) printf(format, ##__VA_ARGS__)
//#define my_printf(format, ...)
typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;
const char * get_jsmn_token_type(const jsmntype_t type)
{
    switch (type) {
        case JSMN_UNDEFINED: return "JSMN_UNDEFINED";
        case JSMN_OBJECT: return "JSMN_OBJECT";
        case JSMN_ARRAY: return "JSMN_ARRAY";
        case JSMN_STRING: return "JSMN_STRING";
        case JSMN_PRIMITIVE: return "JSMN_PRIMITIVE";
        default: return "Unknown"; // 处理未知类型
    }
}
static int jsoneq(const char *json, jsmntok_t *tok, const char *s)
{
    if (tok->start >= tok->end)
    {
        return -1;
    }

    if ( tok->type == JSMN_STRING && (int)strlen(s) == tok->end - tok->start &&
         strncmp(json + tok->start, s, tok->end - tok->start) == 0
       )
    {
        return 0;
    }

    return -1;
}

int main(int argc, char *argv[])
{
    const char *json = "{\"1\":\"11\",\"data\":{\"2\":22,\"3\":33,\"4\":44,\"5\":55,\"6\":66,\"7\":77,\"8\":88,\"9\":99,\"A\":AA,\"B\":BB,\"C\":CC,\"D\":DD,\"E\":EE,\"F\":FF,\"G\":GG,\"H\":\"HH\"},\"I\":0}";
    jsmn_parser parser;
    jsmntok_t tokens[64]; // 假设最多解析x个tokens
    const char *value;
    uint16_t value_len;
    char tmp[64];
    // 初始化解析器
    jsmn_init(&parser);

    // 解析JSON字符串
    int num_tokens = jsmn_parse(&parser, json, strlen(json), tokens, sizeof(tokens)/sizeof(tokens[0]));

    if (num_tokens < 0) {
        my_printf("Failed to parse JSON: %d\n", num_tokens);
        return 1;
    }
    int i, j, k;
    for(i = 0;i < num_tokens; i++)
    {
        my_printf("[line:%3d][%2d][type:%16s][size:%d][%.*s]\n", __LINE__, i, get_jsmn_token_type(tokens[i].type), tokens[i].size, tokens[i].end-tokens[i].start, json+tokens[i].start);
    }

    for (i = 0; i < num_tokens; i++)
    {
        if (tokens[i].type == JSMN_STRING && tokens[i].size == 1)
        { // name均为JSMN_STRING且size=1
            my_printf("[line:%3d][%2d][type:%16s][size:%d]key: %.*s ",__LINE__, i, get_jsmn_token_type(tokens[i].type), tokens[i].size, tokens[i].end-tokens[i].start, json+tokens[i].start);
            if (jsoneq(json, &tokens[i], "data") == 0)
            { // data内为object
                jsmntok_t *data_token = &tokens[i + 1];
                my_printf("\n[line:%3d][%2d][type:%16s][size:%d]value:%.*s\n",__LINE__, i + 1, get_jsmn_token_type(data_token->type), data_token->size, data_token->end-data_token->start, json+data_token->start);
                if (data_token->type == JSMN_OBJECT)
                {
                    for (j=i+2, k=0; j<num_tokens && k<data_token->size; j++,k++)
                    {
                        if (tokens[j].type == JSMN_STRING && tokens[j].size == 1)
                        {
                            my_printf("[line:%3d][%2d][type:%16s][size:%d]key: %.*s ",__LINE__, j, get_jsmn_token_type(tokens[j].type), tokens[j].size, tokens[j].end-tokens[j].start, json+tokens[j].start);
                            // 获取value
                            value = json + tokens[j + 1].start;
                            value_len = tokens[j + 1].end - tokens[j + 1].start;
                            memset (tmp, 0, sizeof(tmp));
                            if (value_len && value_len < sizeof(tmp))
                            {
                                memcpy (tmp, value, value_len);
                                my_printf("[line:%3d]value:%.*s [size:%d][type:%16s]\n", __LINE__, value_len, value, tokens[j+1].size, get_jsmn_token_type(tokens[j+1].type));
                            }

                            j ++;
                        }
                    }
                    i = j-1;
                }
            }
            else
            {
                value = json + tokens[i + 1].start;
                value_len = tokens[i + 1].end - tokens[i + 1].start;
                my_printf("[line:%3d]value:%.*s [size:%d][type:%16s]\n", __LINE__, value_len, value, tokens[i+1].size, get_jsmn_token_type(tokens[i+1].type));
                i++;
            }
        }
    }

    return 0;
}

.vscode目录下:

c_cpp_properties.json内容:

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "cStandard": "c17",
            "cppStandard": "c++17",
            "compilerPath": "E:\\codeblocks-20.03mingw-nosetup\\MinGW\\bin\\g++.exe"
        }
    ],
    "version": 4
}

tasks.json内容:
 

{
	"version": "2.0.0",
	"tasks": [
		{
			"type": "cppbuild",
			"label": "编译jsmn项目文件",
			"command": "E:\\codeblocks-20.03mingw-nosetup\\MinGW\\bin\\g++.exe",
			"args": [
				"-fdiagnostics-color=always",
				"-g",
				"${file}",
				"-o",
				"${fileDirname}\\${fileBasenameNoExtension}.exe"
			],
			"options": {
				"cwd": "E:\\codeblocks-20.03mingw-nosetup\\MinGW\\bin"
			},
			"problemMatcher": [
				"$gcc"
			],
			"group": "build",
			"detail": "编译器: E:\\codeblocks-20.03mingw-nosetup\\MinGW\\bin\\g++.exe"
		}
	]
}

launch.json内容:

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) 启动",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "E:\\codeblocks-20.03mingw-nosetup\\MinGW\\bin\\gdb.exe",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "将反汇编风格设置为 Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ]
        }

    ]
}


http://www.kler.cn/a/286605.html

相关文章:

  • using showdown js with openAi streaming response
  • 详解CSS
  • Jenkins Environment Injector Plugin 插件详解
  • C语言 | Leetcode C语言题解之第390题消除游戏
  • Vue项目“npm run serve”总卡住的问题 已解决
  • 深度强化学习算法(七)(附带MATLAB程序)
  • 鸿蒙Harmony开发实战:自定义圆形组件-Canvas
  • NLP从零开始------文本中阶序列处理之语言模型(完整版)
  • 基于机器学习的酒店评论分析与推荐系统设计
  • JavaWeb实战教程:如何打造旅行社网站系统,提升在线服务能力?
  • Ubuntu 搭建 GLFW 环境及其相关测试 demo
  • UE开发中的设计模式(四) —— 组合模式
  • 使用自制COCO数据集进行PaddleDetection模型训练
  • 论文阅读:VideoMamba: State Space Model for Efficient Video Understanding
  • 【学习笔记】卫星通信NTN 3GPP标准化进展分析(四)- 3GPP Release18内容
  • 【Tools】二叉树后序遍历
  • C#判断用户电脑上是否安装有EXCEL的简单方法
  • 深度强化学习算法(五)(附带MATLAB程序)
  • 读懂华为V模型:连接业务与IT,用V模型指导服务化设计
  • 数据结构与算法---排序算法