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());
}
syslog から抽出された出力を次に示します。
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に渡されるので、正しいと思います。どう見ても機械生成です。