Разбор искаженного JSON с помощью Javascript - PullRequest
1 голос
/ 31 июля 2011

Я хочу проанализировать это содержимое , используя Javascript.Данные выглядят так:

{"ss":[["Thu","7:00","Final",,"BAL","19","ATL","20",,,"56808",,"PRE4","2015"],["Thu","7:00","Final",,"NO","10","GB","38",,,"56809",,"PRE4","2015"]]}

Каждый онлайн-учебник учит вас, как анализировать JSON с помощью Twitter, но я не совсем уверен, как работает синтаксический анализ с JSON.

Я хотел бы установить это на веб-сайте, чтобы просмотреть результаты команды НФЛ для веселого проекта и хороший опыт изучения синтаксического анализа JSON, поскольку мне наплевать на твиттер.

Это возможно?Любые хорошие учебники для начала?Даже какой-нибудь стартовый код?

Ответы [ 7 ]

7 голосов
/ 31 июля 2011

Вообще говоря, вы можете использовать JSON.parse для этого.Однако этот фрагмент, который у вас есть, не является строго допустимым JSON (как показано здесь: http://jsfiddle.net/yK3Gf/, а также путем проверки исходного JSON здесь: http://jsonlint.com/).

Так что вы будетелибо нужно разобрать его вручную, либо заставить nfl.com исправить их JSON.

В качестве альтернативы, их JSON успешно анализирует при использовании eval(), так что вы можете проанализировать его с помощью чего-то вроде:

var parsedData = eval('(' + jsonData + ')');

... как показано здесь: http://jsfiddle.net/yK3Gf/1/

Хотя имейте в виду, что синтаксический анализ JSON таким образом обычно не одобряется (особенно, когда анализируемые данные доставляются третьей стороной).-party source), поскольку он оставляет вас открытыми для XSS-атак, если данные будут включать в себя любой исполняемый код.

3 голосов
/ 14 октября 2012

Я нахожусь в аналогичной должности - не являющийся экспертом по javascript, работающий над забавным проектом по ознакомлению с javascript, ajax и json.

Я сделал три разных шага, чтобы решить проблему. Я приветствую любые отзывы по улучшению решения.

Первый шаг - запросить у сайта nfl результаты. Поскольку источник json, сайт nfl, отличается от вашего сайта, вам придется обойти ограничения безопасности javascript от междоменных запросов. Я нашел эту стековую ссылку хорошей ссылкой. Я использовал JSONP для обхода. Я использовал http://whateverorigin.org/ в качестве сайта косвенного обращения.

$.getJSON('http://whateverorigin.org/get?url=' + encodeURIComponent('http://www.nfl.com/liveupdate/scorestrip/scorestrip.json') + '&callback=?', handleQueryForScoresResult);

Как отмечали другие, сайт nfl возвращает неверные данные json. Следующая строка примера иллюстрирует проблему:

[ "ВС", "4:25", "Final" ,, "ТЭН", "7", "MIN", "30" ,,, "55571" ,, "REG5", "2012"]

Обратите внимание на пустые значения элементов массива (повторяющиеся запятые без данных между ними). Поэтому в моей функции обратного вызова json я исправил данные, добавив пустые строки (две двойные кавычки) к повторным запятым перед вызовом jquery для анализа данных json:

function handleQueryForScoresResult(data) {
    var jsonStr = data.contents;
    jsonStr = jsonStr.replace(/,,/g, ',"",');
    jsonStr = jsonStr.replace(/,,/g, ',"",');

    var scoresData = jQuery.parseJSON(jsonStr).ss;
    .
    .
    .
}

Наконец, я создал объект GameScores для инкапсуляции данных json.

function GameScore(scoreData) {
    this.scoreData = scoreData;
    scoreData[2] = scoreData[2].toLowerCase();
    scoreData[5] = parseInt(scoreData[5]);
    scoreData[7] = parseInt(scoreData[7]);
} 

function GameScore_getAwayTeam() { return this.scoreData[4]; }
function GameScore_getHomeTeam() { return this.scoreData[6]; } 
function GameScore_isFinal() { return this.scoreData[2]=="final"; }  
function GameScore_getHomeTeamScore() { return this.scoreData[7]; }
function GameScore_getAwayTeamScore() { return this.scoreData[5]; }
function GameScore_doesHomeTeamLead() { return this.scoreData[7]> this.scoreData[5]; }
function GameScore_doesAwayTeamLead() { return this.scoreData[5]> this.scoreData[7]; }
function GameScore_getWeekId() { return this.scoreData[12]; }

GameScore.prototype.getHomeTeam = GameScore_getHomeTeam;
GameScore.prototype.getAwayTeam = GameScore_getAwayTeam;
GameScore.prototype.isFinal = GameScore_isFinal;
GameScore.prototype.getHomeTeamScore = GameScore_getHomeTeamScore;
GameScore.prototype.getAwayTeamScore = GameScore_getAwayTeamScore;
GameScore.prototype.doesHomeTeamLead = GameScore_doesHomeTeamLead;
GameScore.prototype.doesAwayTeamLead = GameScore_doesAwayTeamLead;
GameScore.prototype.getWeekId = GameScore_getWeekId;

Я добавил только несколько методов доступа, поскольку мне не требовалось большинство данных. Ваши потребности могут отличаться.

0 голосов
/ 24 июня 2017

Этот искаженный JSON можно проанализировать с помощью пакета dirty-json NPM (я являюсь автором).

Вы можете проверить демо парсера здесь: https://rmarcus.info/dirty-json

Анализатор интерпретирует JSON в исходном вопросе как эквивалент следующего действительного JSON:

{
    "ss": [
        [
            "Thu",
            "7:00",
            "Final",
            "BAL",
            "19",
            "ATL",
            "20",
            "56808",
            "PRE4",
            "2015"
        ],
        [
            "Thu",
            "7:00",
            "Final",
            "NO",
            "10",
            "GB",
            "38",
            "56809",
            "PRE4",
            "2015"
        ]
    ]
}
0 голосов
/ 01 ноября 2015

Для этой конкретной проблемы (пустые индексы в массивах из ответа JSON) я сделал замену регулярного выражения с предварительным утверждением. Учитывая, что запрос содержит XMLHttpRequest:

request.responseText.replace(/,(?=,)/gm, ",\"\"")

Это превратит ,, в ,"",, а также будет работать, если в последовательности больше запятых, поэтому ,,, становится ,"","",. Вы можете использовать JSON.parse() впоследствии.

0 голосов
/ 31 июля 2011

Предположим, у вас уже есть действительный JSON String (jsonString) для анализа. (Если вы не знаете, как извлечь String для анализа с использованием XMLHttpRequest из заданного URL-адреса, сначала вам нужно будет разобраться с этим.)


С простым JavaScript вам нужно будет добавить библиотеку JSON Дугласа Крокфорда (или что-то подобное), чтобы обеспечить синтаксический анализ Function, если нет нативной реализации:

var json = json_parse(jsonString) ;

С такой библиотекой JavaScript, как jQuery , это будет

var json = $.parseJSON(jsonString) ;

Теперь обход результирующего JSON Object - это совсем другая проблема, потому что вам нужно будет знать его структуру, прежде чем вы сможете извлечь конкретные данные. В этом конкретном случае - если он действительно был правильно сформирован - вам нужно будет сделать следующее:

var data = json.ss ;

     for(var i = 0 ; i < data.length ; i++) {

          var entry = data[i] ;

          var day = entry[0] ; //!! the Arrays seem to have a format where the first entry always contains the data and so forth...
          /* ... */

          // then do something with the data bits

     }
0 голосов
/ 31 июля 2011

Ваша основная проблема заключается в том, что JSON, который вы используете, неверен или недействителен в соответствии с RFC 4627.

Что вы можете сделать, это скопировать данные JSON и отформатировать их с помощью этого инструмента http://www.freeformatter.com/json-formatter.html

После того, как у вас есть отформатированная версия, вы можете использовать jQuery ajax call

$.ajax({
    url: "your-formatted.json",
    dataType: 'json',

    success: function (data) {

        for (var i = 0; i < data.ss.length; i++) {
            document.write("Day: " + data.ss[i][0]);
            document.write("<br/>");
            document.write("Time: " + data.ss[i][1]);
            document.write("<br/><br/>");
        }
    }
});

Вы не должны использовать document.write в вашем приложении. Это только для примера отображения данных.

0 голосов
/ 31 июля 2011

Мы используем mootools для подобных вещей, но вы также можете сделать это простым JavaScript: http://www.json.org/js.html.

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