Ryan-CW-Code / RyanJson

一个针对资源受限的嵌入式设备优化的c语言Json库,内存占用极小的通用Json库,简洁高效!
https://ryan-cw-code.github.io/RyanDocs/
Apache License 2.0
13 stars 2 forks source link

double 类型反序列化不成功 #1

Closed StarryPortrait closed 27 minutes ago

StarryPortrait commented 5 hours ago

我使用的是 arm-none-eabi-gcc.exe (GCC) 13.3.0 ,在stm32f103ze中运行 类容如下

void ryanjson_test2()
{
    RyanJson_t jsonRoot = RyanJsonCreateObject();

    RyanJsonAddDoubleToObject(jsonRoot, "double", 16.89f);
    char *str = RyanJsonPrint(jsonRoot, 250, RyanJsonFalse, NULL);
    printf("%s\n %d\n", str, strlen(str));

    RyanJsonFree(str);
    RyanJsonDelete(jsonRoot);
}

输出时只能得到, {"double":} Code_eDk9RvltVM

Ryan-CW-Code commented 4 hours ago

先确保你的平台支持浮点数运算,RyanJson使用以下format标签。

    char number_buffer[256] = {0};
    double f = 16.89;
    snprintf(number_buffer, sizeof(number_buffer), "%.1lf", f);
    printf("%s\n", number_buffer);
    snprintf(number_buffer, sizeof(number_buffer), "%e", f);
    printf("%s\n", number_buffer);
    snprintf(number_buffer, sizeof(number_buffer), "%lf", f);
    printf("%s\n", number_buffer);

输出结果

16.9
1.689000e+001
16.890000
Ryan-CW-Code commented 4 hours ago

static RyanJsonBool RyanJsonPrintNumber(RyanJson_t pJson, printBuffer *buf) 可以在这个函数内部加上打印信息,确保正确进入number格式化输出函数了。

StarryPortrait commented 27 minutes ago

找到原因了,是因为使用的时 newlib-nano 去掉链接参数 -specs=nano.specs 就行了。 或者 使用 mpaland/printf 这个 printf 实现也可以

StarryPortrait commented 27 minutes ago

多谢开发者大佬的帮助