如何在C Linux中解析JSON响应?

时间:2015-04-13 06:43:05

标签: c json parsing cjson

我使用了许多工具,如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结构中获得输出?

1 个答案:

答案 0 :(得分:4)

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

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

但是你的责任来编码从JSON值中提取和验证信息的代码,因为只有你才能知道JSON的真正含义。

JSON只是一种方便的文字serialization格式。您需要为数据赋予实际意义。您还可以决定要编码的验证类型(您在多大程度上信任该JSON数据的发射器?)。如果数据来自互联网(例如AJAX查询等),您应该尽可能少地信任它并尽可能地验证它。

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