Rapidjson解析错误:字符串中无效的编码(207)

时间:2017-05-17 03:13:06

标签: c++ json parsing rapidjson

我有这个相当大的json,我将其输入const char数组,如下所示:

const char tl_json[] = "["
      "{"
        "\"created_at\": \"Thu Apr 06 15:28:43 +0000 2017\","
"\"id\": 850007368138018817,"
"\"id_str\": \"850007368138018817\","
"\"text\": \"RT @TwitterDev: 1/ Today we're sharing our vision for the future of the Twitter API platform!\nhttps://twitter.com","
"\"truncated\": false,"
"\"entities\": {"
"\"hashtags\": [],"
"\"symbols\": [],"
"\"user_mentions\": ["
"{"
"\"screen_name\": \"TwitterDev\","
"\"name\": \"TwitterDev\","
"\"id\": 2244994945,"
"\"id_str\": \"2244994945\","
"\"indices\": ["
"3,"
"14"
"]"
"}"
"],"
"\"urls\": ["
"{"
"\"url\": \"https://twitter.com\","
"\"expanded_url\": \"https://cards.twitter.com/cards/18ce53wgo4h/3xo1c\","
"\"display_url\": \"cards.twitter.com/cards/18ce53wg\","
"\"indices\": ["
"94,"
"117"
"]"
"}"
"]"
"},"
"\"source\": \"<a href='http://twitter.com' rel='nofollow'>Twitter Web Client</a>\","
"\"in_reply_to_status_id\": null,"
"\"in_reply_to_status_id_str\": null,"
"\"in_reply_to_user_id\": null,"
"\"in_reply_to_user_id_str\": null,"
"\"in_reply_to_screen_name\": null,"
"\"user\": {"
"\"id\": 6253282,"
"\"id_str\": \"6253282\","
"\"name\": \"Twitter API\","
"\"screen_name\": \"twitterapi\","
"\"location\": \"San Francisco, CA\","
"\"description\": \"The Real Twitter API. I tweet about API changes, service issues and happily answer questions about Twitter and our API. Don't get an answer? It's on my website.\","
"\"url\": \"https://dev.twitter.com\","
"\"entities\": {"
"\"url\": {"
"\"urls\": ["
"{"
"\"url\": \"https://dev.twitter.com\","
"\"expanded_url\": \"https://dev.twitter.com\","
"\"display_url\": \"dev.twitter.com\","
"\"indices\": ["
"0,"
"22"
"]"
"}"
"]"
"},"
"\"description\": {"
"\"urls\": []"
"}"
"},"
"\"protected\": false,"
"\"followers_count\": 6172353,"
"\"friends_count\": 46,"
"\"listed_count\": 13091,"
"\"created_at\": \"Wed May 23 06:01:13 +0000 2007\","
"\"favourites_count\": 26,"
"\"utc_offset\": -25200,"
"\"time_zone\": \"Pacific Time (US & Canada)\","
"\"geo_enabled\": true,"
"\"verified\": true,"
"\"statuses_count\": 3583,"
"\"lang\": \"en\","
"\"contributors_enabled\": false,"
"\"is_translator\": false,"
"\"is_translation_enabled\": false,"
"\"profile_background_color\": \"C0DEED\","
"\"profile_background_image_url\": \"http://pbs.twimg.com/profile_background_images/656927849/miyt9dpjz77sc0w3d4vj.png\","
"\"profile_background_image_url_https\": \"https://pbs.twimg.com/profile_background_images/656927849/miyt9dpjz77sc0w3d4vj.png\","
"\"profile_background_tile\": true,"
"\"profile_image_url\": \"http://pbs.twimg.com/profile_images/2284174872/7df3h38zabcvjylnyfe3_normal.png\","
"\"profile_image_url_https\": \"https://pbs.twimg.com/profile_images/2284174872/7df3h38zabcvjylnyfe3_normal.png\","
"\"profile_banner_url\": \"https://pbs.twimg.com/profile_banners/6253282/1431474710\","
"\"profile_link_color\": \"0084B4\","
"\"profile_sidebar_border_color\": \"C0DEED\","
"\"profile_sidebar_fill_color\": \"DDEEF6\","
"\"profile_text_color\": \"333333\","
"\"profile_use_background_image\": true,"
"\"has_extended_profile\": false,"
"\"default_profile\": false,"
"\"default_profile_image\": false,"
"\"following\": true,"
"\"follow_request_sent\": false,"
"\"notifications\": false,"
"\"translator_type\": \"regular\""
"},"
"\"geo\": null,"
"\"coordinates\": null,"
"\"place\": null,"
"\"contributors\": null,"
"\"retweeted_status\": {"
"\"created_at\": \"Thu Apr 06 15:24:15 +0000 2017\","
"\"id\": 850006245121695744,"
"\"id_str\": \"850006245121695744\","
"\"text\": \"1/ Today blank sharing our vision for the future of the Twitter API platform!\nhttps://blog.twitter.com/2017/building-the-future-of-the-twitter-api-platform\","
"\"truncated\": false,"
"\"entities\": {"
"\"hashtags\": [],"
"\"symbols\": [],"
"\"user_mentions\": [],"
"\"urls\": ["
"{"
"\"url\": \"https://twitter.com\","
"\"expanded_url\": \"https://cards.twitter.com/cards/18ce53wgo4h/3xo1c\","
"\"display_url\": \"cards.twitter.com/cards/18ce53wg\","
"\"indices\": ["
"78,"
"101"
"]"
"}"
"]"
"},"
"\"source\": \"<a href='http://twitter.com' rel='nofollow'>Twitter Web Client</a>\","
"\"in_reply_to_status_id\": null,"
"\"in_reply_to_status_id_str\": null,"
"\"in_reply_to_user_id\": null,"
"\"in_reply_to_user_id_str\": null,"
"\"in_reply_to_screen_name\": null,"
"\"user\": {"
"\"id\": 2244994945,"
"\"id_str\": \"2244994945\","
"\"name\": \"TwitterDev\","
"\"screen_name\": \"TwitterDev\","
"\"location\": \"Internet\","
"\"description\": \"Your official source for Twitter Platform news, updates & events. Need technical help? Visit https://twitter.com  #TapIntoTwitter\","
"\"url\": \"https://twitter.com\","
"\"entities\": {"
"\"url\": {"
"\"urls\": ["
"{"
"\"url\": \"https://twitter.com\","
"\"expanded_url\": \"https://dev.twitter.com/\","
"\"display_url\": \"dev.twitter.com\","
"\"indices\": ["
"0,"
"23"
"]"
"}"
"]"
"},"
"\"description\": {"
"\"urls\": ["
"{"
"\"url\": \"https://twitter.com\","
"\"expanded_url\": \"https://twittercommunity.com/\","
"\"display_url\": \"twittercommunity.com\","
"\"indices\": ["
"93,"
"116"
"]"
"}"
"]"
"}"
"},"
"\"protected\": false,"
"\"followers_count\": 465425,"
"\"friends_count\": 1523,"
"\"listed_count\": 1168,"
"\"created_at\": \"Sat Dec 14 04:35:55 +0000 2013\","
"\"favourites_count\": 2098,"
"\"utc_offset\": -25200,"
"\"time_zone\": \"Pacific Time (US & Canada)\","
"\"geo_enabled\": true,"
"\"verified\": true,"
"\"statuses_count\": 3031,"
"\"lang\": \"en\","
"\"contributors_enabled\": false,"
"\"is_translator\": false,"
"\"is_translation_enabled\": false,"
"\"profile_background_color\": \"FFFFFF\","
"\"profile_background_image_url\": \"http://abs.twimg.com/images/themes/theme1/bg.png\","
"\"profile_background_image_url_https\": \"https://abs.twimg.com/images/themes/theme1/bg.png\","
"\"profile_background_tile\": false,"
"\"profile_image_url\": \"http://pbs.twimg.com/profile_images/530814764687949824/npQQVkq8_normal.png\","
"\"profile_image_url_https\": \"https://pbs.twimg.com/profile_images/530814764687949824/npQQVkq8_normal.png\","
"\"profile_banner_url\": \"https://pbs.twimg.com/profile_banners/2244994945/1396995246\","
"\"profile_link_color\": \"0084B4\","
"\"profile_sidebar_border_color\": \"FFFFFF\","
"\"profile_sidebar_fill_color\": \"DDEEF6\","
"\"profile_text_color\": \"333333\","
"\"profile_use_background_image\": false,"
"\"has_extended_profile\": false,"
"\"default_profile\": false,"
"\"default_profile_image\": false,"
"\"following\": true,"
"\"follow_request_sent\": false,"
"\"notifications\": false,"
"\"translator_type\": \"regular\""
"},"
"\"geo\": null,"
"\"coordinates\": null,"
"\"place\": null,"
"\"contributors\": null,"
"\"is_quote_status\": false,"
"\"retweet_count\": 284,"
"\"favorite_count\": 399,"
"\"favorited\": false,"
"\"retweeted\": false,"
"\"possibly_sensitive\": false,"
"\"lang\": \"en\""
"},"
"\"is_quote_status\": false,"
"\"retweet_count\": 284,"
"\"favorite_count\": 0,"
"\"favorited\": false,"
"\"retweeted\": false,"
"\"possibly_sensitive\": false,"
"\"lang\": \"en\""
      "}]";

当我尝试像这样解析它时:

char tl_buffer[sizeof(tl_json)];
      memcpy(tl_buffer, tl_json, sizeof(tl_json));
      ParseResult ok = tl_document.ParseInsitu(tl_buffer);
      if (!ok) {
        fprintf(stderr, "JSON parse error: %s (%u)",
        GetParseError_En(ok.Code()), ok.Offset());
        exit(EXIT_FAILURE);
        }

我收到以下错误:

JSON parse error: Invalid encoding in string. (207)

而且我不确定我复制的json b / c有什么问题。粘贴自Twitter API json (it's the json under "Example Response")

当我复制并粘贴时,我注意到“我们”中的'与普通'不同。我还修复了复制和粘贴错误的... b / c。 B / c我在mbed编译时没有收到关于这些字符的警告,但这并没有解决我的主要问题:让json解析。

任何帮助将不胜感激!

注意:为了更好地查看json我已经包含了缩进版本:

"["
      "{"
        "\"created_at\": \"Thu Apr 06 15:28:43 +0000 2017\","
"        \"id\": 850007368138018817,"
"        \"id_str\": \"850007368138018817\","
"        \"text\": \"RT @TwitterDev: 1/ Today we’re sharing our vision for the future of the Twitter API platform!\nhttps://blog.twitter.com/2017/building-the-future-of-the-twitter-api-platform\","
"        \"truncated\": false,"
"        \"entities\": {"
"          \"hashtags\": [],"
"          \"symbols\": [],"
"          \"user_mentions\": ["
"            {"
"              \"screen_name\": \"TwitterDev\","
"              \"name\": \"TwitterDev\","
"              \"id\": 2244994945,"
"              \"id_str\": \"2244994945\","
"              \"indices\": ["
"                3,"
"                14"
"              ]"
"            }"
"          ],"
"          \"urls\": ["
"            {"
"              \"url\": \"https://twitter.com\","
"              \"expanded_url\": \"https://cards.twitter.com/cards/18ce53wgo4h/3xo1c\","
"              \"display_url\": \"cards.twitter.com/cards/18ce53wg…\","
"              \"indices\": ["
"                94,"
"                117"
"              ]"
"            }"
"          ]"
"        },"
"        \"source\": \"<a href='http://twitter.com' rel='nofollow'>Twitter Web Client</a>\","
"        \"in_reply_to_status_id\": null,"
"        \"in_reply_to_status_id_str\": null,"
"        \"in_reply_to_user_id\": null,"
"        \"in_reply_to_user_id_str\": null,"
"        \"in_reply_to_screen_name\": null,"
"        \"user\": {"
"          \"id\": 6253282,"
"          \"id_str\": \"6253282\","
"          \"name\": \"Twitter API\","
"          \"screen_name\": \"twitterapi\","
"          \"location\": \"San Francisco, CA\","
"          \"description\": \"The Real Twitter API. I tweet about API changes, service issues and happily answer questions about Twitter and our API. Don't get an answer? It's on my website.\","
"          \"url\": \"https://twitter.com\","
"          \"entities\": {"
"            \"url\": {"
"              \"urls\": ["
"                {"
"                  \"url\": \"https://twitter.com\","
"                  \"expanded_url\": \"https://dev.twitter.com\","
"                  \"display_url\": \"dev.twitter.com\","
"                  \"indices\": ["
"                    0,"
"                    22"
"                  ]"
"                }"
"              ]"
"            },"
"            \"description\": {"
"              \"urls\": []"
"            }"
"          },"
"          \"protected\": false,"
"          \"followers_count\": 6172353,"
"          \"friends_count\": 46,"
"          \"listed_count\": 13091,"
"          \"created_at\": \"Wed May 23 06:01:13 +0000 2007\","
"          \"favourites_count\": 26,"
"          \"utc_offset\": -25200,"
"          \"time_zone\": \"Pacific Time (US & Canada)\","
"          \"geo_enabled\": true,"
"          \"verified\": true,"
"          \"statuses_count\": 3583,"
"          \"lang\": \"en\","
"          \"contributors_enabled\": false,"
"          \"is_translator\": false,"
"          \"is_translation_enabled\": false,"
"          \"profile_background_color\": \"C0DEED\","
"          \"profile_background_image_url\": \"http://pbs.twimg.com/profile_background_images/656927849/miyt9dpjz77sc0w3d4vj.png\","
"          \"profile_background_image_url_https\": \"https://pbs.twimg.com/profile_background_images/656927849/miyt9dpjz77sc0w3d4vj.png\","
"          \"profile_background_tile\": true,"
"          \"profile_image_url\": \"http://pbs.twimg.com/profile_images/2284174872/7df3h38zabcvjylnyfe3_normal.png\","
"          \"profile_image_url_https\": \"https://pbs.twimg.com/profile_images/2284174872/7df3h38zabcvjylnyfe3_normal.png\","
"          \"profile_banner_url\": \"https://pbs.twimg.com/profile_banners/6253282/1431474710\","
"          \"profile_link_color\": \"0084B4\","
"          \"profile_sidebar_border_color\": \"C0DEED\","
"          \"profile_sidebar_fill_color\": \"DDEEF6\","
"          \"profile_text_color\": \"333333\","
"          \"profile_use_background_image\": true,"
"          \"has_extended_profile\": false,"
"          \"default_profile\": false,"
"          \"default_profile_image\": false,"
"          \"following\": true,"
"          \"follow_request_sent\": false,"
"          \"notifications\": false,"
"          \"translator_type\": \"regular\""
"        },"
"        \"geo\": null,"
"        \"coordinates\": null,"
"        \"place\": null,"
"        \"contributors\": null,"
"        \"retweeted_status\": {"
"          \"created_at\": \"Thu Apr 06 15:24:15 +0000 2017\","
"          \"id\": 850006245121695744,"
"          \"id_str\": \"850006245121695744\","
"          \"text\": \"1/ Today we’re sharing our vision for the future of the Twitter API platform!\nhttps://twitter.com\","
"          \"truncated\": false,"
"          \"entities\": {"
"            \"hashtags\": [],"
"            \"symbols\": [],"
"            \"user_mentions\": [],"
"            \"urls\": ["
"              {"
"                \"url\": \"https://twitter.com\","
"                \"expanded_url\": \"https://cards.twitter.com/cards/18ce53wgo4h/3xo1c\","
"                \"display_url\": \"cards.twitter.com/cards/18ce53wg…\","
"                \"indices\": ["
"                  78,"
"                  101"
"                ]"
"              }"
"            ]"
"          },"
"          \"source\": \"<a href='http://twitter.com' rel='nofollow'>Twitter Web Client</a>\","
"          \"in_reply_to_status_id\": null,"
"          \"in_reply_to_status_id_str\": null,"
"          \"in_reply_to_user_id\": null,"
"          \"in_reply_to_user_id_str\": null,"
"          \"in_reply_to_screen_name\": null,"
"          \"user\": {"
"            \"id\": 2244994945,"
"            \"id_str\": \"2244994945\","
"            \"name\": \"TwitterDev\","
"            \"screen_name\": \"TwitterDev\","
"            \"location\": \"Internet\","
"            \"description\": \"Your official source for Twitter Platform news, updates & events. Need technical help? Visit https://twitter.com ⌨️  #TapIntoTwitter\","
"            \"url\": \"https://twitter.com\","
"            \"entities\": {"
"              \"url\": {"
"                \"urls\": ["
"                  {"
"                    \"url\": \"https://twitter.com\","
"                    \"expanded_url\": \"https://dev.twitter.com/\","
"                    \"display_url\": \"dev.twitter.com\","
"                    \"indices\": ["
"                      0,"
"                      23"
"                    ]"
"                  }"
"                ]"
"              },"
"              \"description\": {"
"                \"urls\": ["
"                  {"
"                    \"url\": \"https://twitter.com\","
"                    \"expanded_url\": \"https://twittercommunity.com/\","
"                    \"display_url\": \"twittercommunity.com\","
"                    \"indices\": ["
"                      93,"
"                      116"
"                    ]"
"                  }"
"                ]"
"              }"
"            },"
"            \"protected\": false,"
"            \"followers_count\": 465425,"
"            \"friends_count\": 1523,"
"            \"listed_count\": 1168,"
"            \"created_at\": \"Sat Dec 14 04:35:55 +0000 2013\","
"            \"favourites_count\": 2098,"
"            \"utc_offset\": -25200,"
"            \"time_zone\": \"Pacific Time (US & Canada)\","
"            \"geo_enabled\": true,"
"            \"verified\": true,"
"            \"statuses_count\": 3031,"
"            \"lang\": \"en\","
"            \"contributors_enabled\": false,"
"            \"is_translator\": false,"
"            \"is_translation_enabled\": false,"
"            \"profile_background_color\": \"FFFFFF\","
"            \"profile_background_image_url\": \"http://abs.twimg.com/images/themes/theme1/bg.png\","
"            \"profile_background_image_url_https\": \"https://abs.twimg.com/images/themes/theme1/bg.png\","
"            \"profile_background_tile\": false,"
"            \"profile_image_url\": \"http://pbs.twimg.com/profile_images/530814764687949824/npQQVkq8_normal.png\","
"            \"profile_image_url_https\": \"https://pbs.twimg.com/profile_images/530814764687949824/npQQVkq8_normal.png\","
"            \"profile_banner_url\": \"https://pbs.twimg.com/profile_banners/2244994945/1396995246\","
"            \"profile_link_color\": \"0084B4\","
"            \"profile_sidebar_border_color\": \"FFFFFF\","
"            \"profile_sidebar_fill_color\": \"DDEEF6\","
"            \"profile_text_color\": \"333333\","
"            \"profile_use_background_image\": false,"
"            \"has_extended_profile\": false,"
"            \"default_profile\": false,"
"            \"default_profile_image\": false,"
"            \"following\": true,"
"            \"follow_request_sent\": false,"
"            \"notifications\": false,"
"            \"translator_type\": \"regular\""
"          },"
"          \"geo\": null,"
"          \"coordinates\": null,"
"          \"place\": null,"
"          \"contributors\": null,"
"          \"is_quote_status\": false,"
"          \"retweet_count\": 284,"
"          \"favorite_count\": 399,"
"          \"favorited\": false,"
"          \"retweeted\": false,"
"          \"possibly_sensitive\": false,"
"          \"lang\": \"en\""
"        },"
"        \"is_quote_status\": false,"
"        \"retweet_count\": 284,"
"        \"favorite_count\": 0,"
"        \"favorited\": false,"
"        \"retweeted\": false,"
"        \"possibly_sensitive\": false,"
"        \"lang\": \"en\""
      "}]";

1 个答案:

答案 0 :(得分:1)

你的问题是你没有逃避输入中的所有反斜杠。因此,{C}编译器将\n序列解释为换行符的转义序列,但JSON不允许字符串中的文字换行符。例如,尝试解析此问题,您将遇到同样的问题:

char const tl_json[] = "{\"a\":\"foo\nbar\"}";

这将生成以下字符串文字:

{"a":"foo
bar"}

由于字符串中嵌入了换行符,因此这不是有效的JSON。 JSON允许空格在标记之间显示,但字符串是单个标记,并且不允许在其中显示换行符。

您还需要转义反斜杠字符,以便C字符串包含\n作为两个字符 - 反斜杠后跟n - JSON解析器将其视为转义符序列并将其解析为嵌入式换行符。比较:

char const tl_json[] = "{\"a\":\"foo\\nbar\"}";

这会编码以下JSON字符串,解析:

{"a":"foo\nbar"}

例如,此问题在您的代码中至少出现一次:

... future of the Twitter API platform!\nhttps://blog ...