Сложность с Rapidjson .11 GetInt (), всегда возвращает 0

Вот форма json:

{"simpleChannels":{"item":[{"channelID":4248,"majorChannelNumber":22,"minorChannelNumber":0,"channelType":"SLL","simpleSchedules":[],"channelKey":"4248_1343210400000","shortName":"KWHY","longName":"A3 Los Angeles 22 KWHY IND","networkAffiliation":["Independent"],"logoID":0,"authCode":"FS","engChlFlag":false,"hasMirror":true,"pgSource":"ACTIVE","hdChlFlag":true,"adultChlFlag":false,"vodProviderId":0,"blackOut":false,"liveStreaming":"N"}]}}

Вот код, который пытается анализировать и извлекать значения:
json - это std :: string, содержащая указанное выше:

    m_guideSlice.Parse<0>(json.c_str());
    rapidjson::Value& simpleChannels = m_guideSlice["simpleChannels"];
    if (simpleChannels.IsObject()) {
        SYSLOG_CRITICAL("simpleChannels.IsObject() == true\n");
        rapidjson::Value& channelArray= simpleChannels["item"];
        if (channelArray.IsArray()) {
            SYSLOG_CRITICAL("channelArray.IsArray() == true\n");
            rapidjson::Value& channel = channelArray[0u];
            if (channel.IsObject()) {
                SYSLOG_CRITICAL("channel.isObject() == true\n");
                rapidjson::Value& channelID = channel["channelID"];
                if (channelID.IsInt()) {
                    SYSLOG_CRITICAL("channelID.IsInt() == true, channelID= %d\n", channelID.GetInt());
                }
                else {
                    SYSLOG_CRITICAL("channelID.IsInt() == false, type= %X\n", channelID.GetType());                     
                }
                rapidjson::Value& majorChannelNumber = channel["majorChannelNumber"];
                if (majorChannelNumber.IsInt()) {
                    SYSLOG_CRITICAL("majorChannelNumber.IsInt() == true, majorChannelNumber= %d\n", majorChannelNumber.GetInt());
                }
                else {
                    SYSLOG_CRITICAL("majorChannelNumber.IsInt() == false, type= %X\n", majorChannelNumber.GetType());                       
                }
                rapidjson::Value& channelType = channel["channelType"];
                if (channelType.IsString()) {
                    SYSLOG_CRITICAL("channelType.IsString() == true\n")
                    SYSLOG_CRITICAL("channelType = %s\n", channelType.GetString());
                }
                else {
                    SYSLOG_CRITICAL("channelType.IsString() == false, type= %X\n", channelType.GetType());
                }
                rapidjson::Value& shortName = channel["shortName"];
                if (channelType.IsString()) {
                    SYSLOG_CRITICAL("shortName.IsString() == true\n")
                    SYSLOG_CRITICAL("shortName = %s\n", shortName.GetString());
                }
                else {
                    SYSLOG_CRITICAL("shortName.IsString() == false, type= %X\n", shortName.GetType());
                }
            }
            else {
                SYSLOG_CRITICAL("channel.IsObject() == false, type= %X\n", channel.GetType());
            }
        }
        else {
            SYSLOG_CRITICAL("channelArray.IsArray() == false, type= %X\n", channelArray.GetType());             
        }
    }
    else {
        SYSLOG_CRITICAL("simpleChannels.IsObject() == false, type= %X\n", simpleChannels.GetType());
    }

Вот извлеченный вывод из системного журнала:

May 19 01:25:38   [BSP] [30578]: [PGWS-GEN LOG_CRIT tid:30744 pthr:0x7033e4f0]:   (PgwsIngest.cpp:78) getGuide(): simpleChannels.IsObject() == true 
May 19 01:25:38   [BSP] [30578]: [PGWS-GEN LOG_CRIT tid:30744 pthr:0x7033e4f0]: (PgwsIngest.cpp:81) getGuide(): channelArray.IsArray() == true 
May 19 01:25:38   [BSP] [30578]: [PGWS-GEN LOG_CRIT tid:30744 pthr:0x7033e4f0]: (PgwsIngest.cpp:84) getGuide(): channel.isObject() == true 
May 19 01:25:38   [BSP] [30578]: [PGWS-GEN LOG_CRIT tid:30744 pthr:0x7033e4f0]: (PgwsIngest.cpp:87) getGuide(): channelID.IsInt() == true, channelID= 0 
May 19 01:25:38   [BSP] [30578]: [PGWS-GEN LOG_CRIT tid:30744 pthr:0x7033e4f0]: (PgwsIngest.cpp:94) getGuide(): majorChannelNumber.IsInt() == true, majorChannelNumber= 0 
May 19 01:25:38   [BSP] [30578]: [PGWS-GEN LOG_CRIT tid:30744 pthr:0x7033e4f0]: (PgwsIngest.cpp:101) getGuide(): channelType.IsString() == true 
May 19 01:25:38   [BSP] [30578]: [PGWS-GEN LOG_CRIT tid:30744 pthr:0x7033e4f0]: (PgwsIngest.cpp:102) getGuide(): channelType = SLL 
May 19 01:25:38   [BSP] [30578]: [PGWS-GEN LOG_CRIT tid:30744 pthr:0x7033e4f0]: (PgwsIngest.cpp:109) getGuide(): shortName.IsString() == true 
May 19 01:25:38   [BSP] [30578]: [PGWS-GEN LOG_CRIT tid:30744 pthr:0x7033e4f0]: (PgwsIngest.cpp:110) getGuide(): shortName = KWHY   

Значения char json извлекаются правильно, но значения int всегда равны 0. Я впервые использую Rapidjson, поэтому я уверен, что делаю простую ошибку, но не сразу ее вижу.

Спасибо всем,

Кстати, форма json проходит на http://www.freeformatter.com/json-validator.html так что я считаю это правильным. В любом случае это сгенерировано машиной.


person kelvin    schedule 19.05.2013    source источник


Ответы (2)


Я работаю на машине с прямым порядком байтов, и компилятор не должен передавать соответствующий флаг, указывающий на порядок байтов.
Явная установка флага:

определить RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN

в rapidsjon.h следует это исправить.

person kelvin    schedule 20.05.2013
comment
Я автор rapidjson. Могу ли я узнать в вашей среде, какой способ лучше определять порядок байтов? - person Milo Yip; 29.06.2014

Мы улучшили определение порядка байтов в этом запросе на вытягивание.

Он обнаружит больше макросов, определенных платформой. Если он не может успешно обнаружить, он генерирует ошибку препроцессора, и тогда вы должны определить RAPIDJSON_ENDIAN.

Вы можете объединить это различие со своей версией, чтобы посмотреть, поможет ли это.

person Milo Yip    schedule 13.08.2014