2

我使用了许多工具,例如 cJSON、nxjson 和 jsmn 解析器来解析 JSON 响应,但我使用的工具都没有以某种结构格式提供输出。下面是我在字符串中的 JSON 响应:

{"Code":1,"MSN":0,"HWID":7001,"Data":{"SignOffRequest":{"messageId":0,"barCodeReadErrorCnt":0,"markSenseReadErrorCnt":0,"markSenseValidationErrorCnt":0,"postPrintErrorCnt":0,"custTicketFeedErrorCnt":0,"custInputTicketJamsCnt":0,"keyStrokeCnt":0,"keyStrokeErrorCnt":0,"commCrcErrorCnt":0,"readTxnCnt":0,"keyedTxnCnt":0,"ticketMotionErrorCnt":0,"blankFeedErrorCnt":0,"blankTicketJamCnt":0,"startupNormalRespCnt":0,"startupErrorRespCnt":0,"primCommMesgSentCnt":0,"commRetransmitTxnCnt":0,"rawMessage":null,"TableUpdateNo":1,"FixtureUpdateNo":0}}}

我使用了 cJSON 工具,输出如下,它也是一个字符串:

{
    "Code": 1,
    "MSN":  0,
    "HWID": 7001,
    "Data": {
        "SignOffRequest":   {
            "messageId":    0,
            "barCodeReadErrorCnt":  0,
            "markSenseReadErrorCnt":    0,
            "markSenseValidationErrorCnt":  0,
            "postPrintErrorCnt":    0,
            "custTicketFeedErrorCnt":   0,
            "custInputTicketJamsCnt":   0,
            "keyStrokeCnt": 0,
            "keyStrokeErrorCnt":    0,
            "commCrcErrorCnt":  0,
            "readTxnCnt":   0,
            "keyedTxnCnt":  0,
            "ticketMotionErrorCnt": 0,
            "blankFeedErrorCnt":    0,
            "blankTicketJamCnt":    0,
            "startupNormalRespCnt": 0,
            "startupErrorRespCnt":  0,
            "primCommMesgSentCnt":  0,
            "commRetransmitTxnCnt": 0,
            "rawMessage":   null,
            "TableUpdateNo":    1,
            "FixtureUpdateNo":  0
        }
    }
}

但我不想要上述格式的输出。我想要 C 结构形式的输出。是否可以在 C 结构中获得输出?

4

1 回答 1

4

您需要添加从解析的 JSON 值中提取相关字段等的显式代码......这通常不能神奇地自动化。

一些 JSON 库稍微促进了这项任务。例如jansson有一个非常有用的json_unpack函数,您可以使用它从解析的 JSON 值中提取(在一次调用中)一些字段。

但是,您有责任对 JSON 值中的信息提取和验证进行编码,因为只有您才能知道 JSON 的真正含义。

JSON只是一种方便的文本序列化格式。赋予数据实际意义取决于您。您还可以决定要编码哪种验证(您在多大程度上信任该 JSON 数据的发射器?)。如果数据来自 Internet(例如 AJAX 查询等),您应该尽可能少地信任它并尽可能地验证它。

不要忘记记录 JSON 数据的含义。

于 2015-04-13T06:49:44.027 回答