This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP432E401Y:临界情况下的 JSON 解析问题。

Guru**** 2561760 points
Other Parts Discussed in Thread: MSP432E401Y

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/837070/msp432e401y-json-parsing-issue-in-corner-case

器件型号:MSP432E401Y

您好!

我们正在使用 SDK 中包含的 JSON 库、我们会看到一个属性解析问题。

也可以将其复制到 EVM 板上重新编写 MSP432E401Y SDK 中包含的示例。

基本而言、我们有:  

一个模板

2 -由库正确解析的 JSON 工作块

3 - JSON 的一个非工作部分、具有相同的语义、但具有一个属性、仅在同一树级别下移动了2行。

当我们使用3而不是2时、同一属性读作随机值、而不是预期值。

其他值的读数似乎是预期值。

模板下方是工作的 JSON、相同的不工作的 JSON 以及 UART 上的输出。

-->保留3中随机值 但不保留2中随机值的属性是"\"WIFI\"。\"WiFiOn\"。

如果需要、我们可以提供完整的.c 重运行示例。

有什么建议吗? 这是否是库中的临界情况错误?

谢谢、

Giuseppe

------------------------------------------------------------------

#define example_template                                         \
"{                                                         "\
"  \"IPveth4Conf\":{                                     "\"
"\"ipv4Addr\"                             :string、      "\"
"\"ipv4Netmask\"                              :string、  "\"
“                      \"ipv4Gateway\"    :字符串      ,"\"
“                      \"ipv4socketTimeout\"  :uint32,   "\
“                      \"DHCPenable\"     :布尔     值“\”
"                  }、                                     "\
"                                                           "\
“ \"WIFI\":{                                             "\
“      \"SSID\":字符串,                                 “\”
“      \"passwd\":string,                               "\
“      \"WiFiOn\":布尔                              值“\
"  }                                                     "\
"}"

----------------------------------------

#define Example_JSONBUF_working                                                \
"{                                                                             "\
"  \"IPveth4Conf\":{                                                         "\"
"\"ipv4Addr\"                             :\"192.168.1.100\",               "\"
"\"ipv4Netmask\"                              :\"255.255.255.0 \",           "\"
"\"ipv4Gateway\"                          :\"192.168.1.1\",                 "\"
“                      \"ipv4socketTimeout\"  :10,                          “\”
“                      \"DHCPenable\"     :false                            ”
"                  }、                                                         "\
"                                                                              "\
“  \"WIFI\":{                                                               "\
“                      \"WiFiOn\":false,                                    "\
“                      \"SSID\":\"mynetwork\",                              “\”
"                      \"passwd\":\"abcdefghil\"                            "\
"                  }                                                          "\
"}"

----------------------------------------------------

#define Example_JSONBUF_NON_working                                                \
"{                                                                             "\
"  \"IPveth4Conf\":{                                                         "\"
"\"ipv4Addr\"                             :\"192.168.1.100\",               "\"
"\"ipv4Netmask\"                              :\"255.255.255.0 \",           "\"
"\"ipv4Gateway\"                          :\"192.168.1.1\",                 "\"
“                      \"ipv4socketTimeout\"  :10,                          “\”
“                      \"DHCPenable\"     :false                            ”
"                  }、                                                         "\
"                                                                              "\
“  \"WIFI\":{                                                               "\
“                      \"SSID\":\"mynetwork\",                              “\”
"                      \"passwd\":\"abcdefghil\",                           "\"
“                      \"WiFiOn\":false                                    ”
"                  }                                                          "\
"}"

(图2 产出

使用(2)


从模板创建的 JSON 对象
已解析 JSON 缓冲器
DHCPENABLE 值:0
SSID 值:MyNetwork
passwd 值:abcdefghil
WiFiOn 值:0
完成了 JSON 示例

秘书长的报告

使用 (3)

从模板创建的 JSON 对象
已解析 JSON 缓冲器
DHCPENABLE 值:0
SSID 值:MyNetwork
passwd 值:abcdefghil
WiFiOn 值:768
完成了 JSON 示例

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我将其发送给了一名相关的工程师。 我们会尽快回复您。 请多多包涵。

    谢谢、

    PM

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    有任何有关这方面的新闻吗?

    谢谢、

    Giuseppe C.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Giuseppe、您好!

    对延误表示歉意。 我将处理此问题、并在一天结束后返回。

    谢谢、

    SAI

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Giuseppe、

    我猜这些值是:

    DHCPENABLE 值:0
    SSID 值:MyNetwork
    passwd 值:abcdefghil
    WiFiOn 值:768
    完成了 JSON 示例

    是通过调用`JSON_getValue`然后调用`printf`生成的?

    奇怪的是、仅当物体内"WiFiOn"字段的位置发生移位时、才会出现该问题。 在打印解析的值后、我能够再现与您的结果类似的内容:

    //将返回的 void*转换为 uint16_t 会产生不正确的输出
    Retret = JSON_getVal (objectHandle、"\"WIFI\"、"WiFiOn\"、voidp、&retSize);
    printf ("\nWIFI.WiFiVal 值:%d\n"、*(uint16)
    
    
    
    、void (*)、wifi Retrule、%/nveup (*)。 

    问题是否与此类似? 如果没有、请随时分享您的代码。

    最棒的

    Brandon

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Brandon、

    感谢您的观看、但实际上我认为选择 bool 并不是一个好主意:

    JSON_getValue 需要一个2字节的缓冲区(实际上仅为 JSON_setValue 记录了此缓冲区)、 我使用 CCS 内存浏览器验证 了 在执行 JSON_getValue 时更改2字节的内存。 在我的情况下、这2个字节被分配给(0x0、0x3)

    另一方面、sizeof (bool) 等于1、  如果调用 retSize 为1、则 JSON_getValue 将失败。  在读取参数后转换为 bool,可能会导致打印0,但这是错误转换的副作用。

    请找到随附的修改示例、该示例应重现问题。

    谢谢、

    Giuseppe C.  

    e2e.ti.com/.../json.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Giuseppe、

    感谢您提供代码。 我想当您使用 example_JSONBUF_working 时、您会幸运/不幸运地获得存储器中的值、我认为您选择用于存储该值的变量大小是错误输出值的来源。 正如您所说的、sizeof (bool)为1、因此我认为我们应该仅尝试读取由 JSON_getValue 检索到的存储器的单个字节。 我认为、通过使用 sizeof (uint16_t) 来解释返回值(无论是显式通过转换到 uint16_t 指针、还是隐式通过使用 uint16_t 变量作为存储)、您读取的字节比需要多一个。 JSON_getValue 复制了两个字节这一事实是库内部处理布尔值的不幸后果。 我相信您提供的代码在一种情况下是有效的、但在另一种情况下不起作用、因为0x0位于布尔值旁边的存储器中、而不是0x3、因此当读取两个字节而不是一个打印值时、打印值仍然显示为预期的布尔值。

    如果您采用 Example_JSONBUF_working 并将 ipv4socketTimeout 的值增加到需要超过一个字节才能存储的某个值、那么如果您还选择从 DHCPenable 的存储器地址读取两个字节而不是读取一个字节、则会开始为以下布尔字段 DHCPenable 获取奇怪的结果。

    在解释布尔 json 字段上调用的 JSON_getValue 的返回值时、我只建议使用1的大小值。 如果您使用布尔变量作为 JSON_getValue 的输入(而不是像字符数组这样更通用的变量)、然后输出此值、您将获得正确的结果、因为布尔值仅占用一个字节。

    这似乎自相矛盾、或者至少不是很正确、因为如果您像您说的那样将 maxValueSize 指定为1、则 JSON_getValue 会失败。 但如果您查看代码中的大小检查功能、布尔值没有特殊情况、而是选择使用 sizeof (uint16_t)进行错误检查。 我可以看到为什么这会导致某人在尝试检索布尔值时使用 uint16_t、但我不认为这是使用此库时应如何处理布尔值的原因。 这是我根据使用和测试得出的意见。 库中缺少有关特定详细信息的原始文档、因此我无法肯定目标使用模式是什么。

    感谢您提供有关 JSON_getValue 的说明。 我们将更新文档。

    最棒的

    Brandon

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Brandon、

    感谢您的解释。

    我们在 EVM 示例上进行了一些测试、也使用了其他值、得出了相同的结论:

    实际上、似乎有2个字节被复制到输入缓冲区中、但只需要考虑一个字节、就像库将另一个字节的不相关数据复制到用户缓冲区一样。

    根据到目前为止的测试、我尚未发现建议的方法造成的任何副作用或损坏、

    因此、我们将在我们正在开发的实际应用中尝试此操作、并将此线程标记为"已回答"。

    不过、这个库行为看起来非常奇怪...

    谢谢、

    Giuseppe