Может ли неправильно сформированная строка JSON быть успешно проанализирована? - PullRequest
0 голосов
/ 28 февраля 2011

Вот пример строки:

String s = "{\"source\": \"another \"quote inside\" text\"}";

Какой самый лучший способ разобрать это?Я уже пробовал 4 парсера: json-lib , json-simple , gson и встроенный JSON-анализатор Grails .

Я использую Java и хочу знать, есть ли способ исправить строку после перехвата MalformedJsonException или чего-то еще.

Примечание. Или это может быть ошибкой в ​​API Twitter?Вот пример строки ответа:

{
    "coordinates": null,
    "user": {
        "is_translator": false,
        "show_all_inline_media": false,
        "following": null,
        "geo_enabled": false,
        "profile_background_color": "C0DEED",
        "listed_count": 11,
        "profile_background_image_url": "http://a3.twimg.com/a/1298064126/images/themes/theme1/bg.png",
        "favourites_count": 4,
        "followers_count": 66,
        "contributors_enabled": false,
        "statuses_count": 1078,
        "time_zone": "Tokyo",
        "profile_text_color": "333333",
        "friends_count": 51,
        "profile_sidebar_fill_color": "DDEEF6",
        "id_str": "107723125",
        "profile_background_tile": false,
        "created_at": "Sat Jan 23 14:16:03 +0000 2010",
        "profile_image_url": "http://a3.twimg.com/profile_images/652140488/--------------_normal.jpg",
        "description": "Mu8ecdu56e3u306eu56e3u9577u3068u30eau30fcu30c0u30fcu3067u3059u3002u8da3u5473u306fu7af6u99acu306eu4e88u60f3u3068u30b0u30e9u30c3u30d7u30eau30f3u30b0u3068u6253u6483u3092u30e1u30a4u30f3u3068u3057u3066u3044u307eu3059u3063uff01",
        "location": "u5bccu5c71u770c",
        "notifications": null,
        "profile_link_color": "0084B4",
        "protected": false,
        "screen_name": "mattsun0209",
        "follow_request_sent": null,
        "lang": "ja",
        "profile_sidebar_border_color": "C0DEED",
        "name": "u307eu3063u3064u3093",
        "verified": false,
        "id": 107723125,
        "profile_use_background_image": true,
        "utc_offset": 32400,
        "url": null
    },
    "in_reply_to_screen_name": null,
    "in_reply_to_status_id": null,
    "in_reply_to_status_id_str": null,
    "in_reply_to_user_id": null,
    "text": "u3042u30fcu3001u7d50u819cu708eu306bu306au3063u3066u3057u307eu3063u305fu3002",
    "contributors": null,
    "retweeted": false,
    "in_reply_to_user_id_str": null,
    "retweet_count": 0,
    "source": "u003Ca href="http: //twtr.jp" rel="nofollow"u003EKeitai Webu003C/au003E",
    "id_str": "42128197566861312",
    "created_at": "Mon Feb 28 07:45:19 +0000 2011",
    "geo": null,
    "entities": {
        "hashtags": [],
        "user_mentions": [],
        "urls": []
    },
    "truncated": false,
    "place": null,
    "id": 42128197566861312,
    "favorited": false
}

Обратите внимание на свойство source:

"source": "u003Ca href="http: //twtr.jp" rel="nofollow"u003EKeitai Webu003C/au003E"

Ответы [ 3 ]

6 голосов
/ 28 февраля 2011

Боюсь, это классическая ситуация "мусор в мусоре". JSON недействителен , поэтому вы не можете его правильно проанализировать. Вы можете только догадываться, что это такое. Теперь мы, люди, можем довольно хорошо догадаться о том, что было задумано (очевидно), но это намного сложнее на уровне анализатора.

Если вы знаете, что последовательно получаете это недействительное свойство source, вы можете предварительно обработать строку перед ее десериализацией, но реальное исправление должно быть в источнике недопустимых данных & mdash; Твиттер или что-то вроде этого (как бы) предоставляет его. Я предполагаю, что это фактические строковые данные, которые вы получили, а не обработанная их форма.

0 голосов
/ 28 февраля 2011

В соответствии с грамматикой JSON этот формат недопустим.Если вы не работаете в Twitter, единственный жизнеспособный выбор - это предварительная обработка ответа перед его анализом.

0 голосов
/ 28 февраля 2011

Предварительная обработка данных перед их анализом.

Для каждой строки найдите первое двоеточие (при условии, что в именах свойств нет двоеточий), затем экранируйте каждую двойную кавычку в строке, кроме первой после двоеточия и последней в строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...