I have this rather large json, which I feed into a const char
array like so:
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\""
"}]";
When I try to parse it like this:
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);
}
I get the following error:
JSON parse error: Invalid encoding in string. (207)
And I'm not sure what's wrong with my json b/c I copied & pasted from the Twitter API json (it's the json under "Example Response")
When I copied and pasted I noticed the '
in "we're" was a different character than the normal '
. I also fixed the ...
b/c that was also copied and pasted wrong. B/c of that I don't get a warning on those characters when I compile in mbed
, but that hasn't fixed my main problem: getting the json to parse.
Any help would be appreciated!
Note: To see the json better I've included a indented version:
"["
"{"
"\"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\""
"}]";
Your problem is that you did not escape all backslashes in the input. Because of this, the \n
sequence is being interpreted in your C++ compiler as an escape sequence for the newline character, but JSON does not permit literal newlines in strings. For example, try parsing this and you'll have the same problem:
char const tl_json[] = "{\"a\":\"foo\nbar\"}";
This produces the following string literal:
{"a":"foo
bar"}
This isn't valid JSON because of the newline embedded in the string. JSON allows whitespace to appear between tokens, but a string is a single token and newlines are not permitted to appear in them.
You need to escape the backslash characters as well, so that the C string contains \n
as two characters -- a backslash followed by an n
-- which the JSON parser will see as an escape sequence and parse it as an embedded newline. Compare:
char const tl_json[] = "{\"a\":\"foo\\nbar\"}";
This encodes the following JSON string, which will parse:
{"a":"foo\nbar"}
For example, this problem appears at least once in your code:
... future of the Twitter API platform!\nhttps://blog ...