c - 使用 sscanf() 解析 Json 消息

标签 c json udp scanf

我的应用程序通过 UDP 从对象的坐标接收 JSon 消息,如下所示:

{
    "FRAME1": {
        "X": "-0.885498",
        "Y": "-0.205078",
        "Z": "0.628174"
    },
    "FRAME2": {
        "X": "1.70898",
        "Y": "-5.67627",
        "Z": "0.305176"
    },
    "ID": "DEVICE9",
    "TS": "7.9900"
}

我需要从 FRAME1FRAME2 读取坐标(每帧的 X、Y、Z 值)。 Json 消息存储在 char[] msg 中。我使用以下两行代码获取 FRAME1 的坐标:

char Xc[32], Yc[32], Zc[32];
sscanf (msg,
        "{\"X\":\"%s\",\"Y\":\"%s\",\"Z\":\"%s\"}",
        Xc, Yc, Zc);

我用 printf 将存储的值显示为:

printf("X coordinate is: %s\n" , Xc);

但是输出很奇怪:

X coordinate is: |-

sscanf() 提供的格式有什么问题?

最佳答案

带有 %n 说明符的

sscanfstrcmp 可用于解析字符串。 %n 捕获扫描中使用的字符数。

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

int main()
{
    int index = 0;
    int offset = 0;
    char sub[300] = "";
    char Xc[32] = "";
    char Yc[32] = "";
    char Zc[32] = "";
    char msg[] = {
    "{\n\
    \"FRAME1\": {\n\
        \"X\": \"-0.885498\",\n\
        \"Y\": \"-0.205078\",\n\
        \"Z\": \"0.628174\"\n\
    },\n\
    \"FRAME2\": {\n\
        \"X\": \"1.70898\",\n\
        \"Y\": \"-5.67627\",\n\
        \"Z\": \"0.305176\"\n\
        },\n\
        \"ID\": \"DEVICE9\",\n\
        \"TS\": \"7.9900\"\n\
    }\n"
    };

    offset = 0;
    while ( ( sscanf ( msg + offset, "%299s%n", sub, &index)) == 1) {
        offset += index;
        if ( strcmp (sub, "\"X\":" ) == 0) {
            if ( ( sscanf ( msg + offset, "%31s%n", Xc, &index)) == 1) {
                offset += index;
                printf ( "Xc is %s\n", Xc);
            }
        }
        if ( strcmp (sub, "\"Y\":" ) == 0) {
            if ( ( sscanf ( msg + offset, "%31s%n", Yc, &index)) == 1) {
                offset += index;
                printf ( "Yc is %s\n", Yc);
            }
        }
        if ( strcmp (sub, "\"Z\":" ) == 0) {
            if ( ( sscanf ( msg + offset, "%31s%n", Zc, &index)) == 1) {
                offset += index;
                printf ( "Zc is %s\n", Zc);
            }
        }
    }

    return 0;
}

上面的坐标 sscanf 将包含引号。这可用于删除引号

if ( ( sscanf ( msg + offset, " \"%31[^\"]%*s%n", Xc, &index)) == 1) {

关于c - 使用 sscanf() 解析 Json 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35503511/

相关文章:

javascript - 在 AJAX JSON 响应中包含 HTML

sockets - 第一次响应后 TCP 服务器失败

LuaSocket (UDP) 不接收数据报

c - 使用 sprintf() 时遇到问题

c - 递归函数的空间复杂度(Time & Space)

将 int 转换为 char C 公式

json - Angular,使用 ngIf、async 和 Observable 等待数据准备好显示内容时出现问题

json - 如何解码另一个数组中的 JSON 数组

c++ - 读取访问冲突。在 C++ 中将 udp 数据导入 vector 时,_Mycont 是 nullptr 错误

c - gdb 查看核心转储中的结构值