2013-06-25 2 views
3

Я пытаюсь разобрать этот запас информации по адресу:Попытка разобрать JSON в строку в Java

http://www.google.com/finance/info?client=ig&q=csco

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

Учебник ссылка: https://code.google.com/p/quick-json/

public static void main(String args[]) throws IOException 
{ 
    String value=""; 
    URL uri = new URL("http://www.google.com/finance/info?client=ig&q=csco"); 
    BufferedReader input = new BufferedReader(new InputStreamReader(uri.openStream(), "UTF-8")); 
    while(input.readLine()!=null) 
    { 
     value+=input.readLine(); 
    } 
    JsonParserFactory factory = JsonParserFactory.getInstance(); 
    JSONParser parse = factory.newJsonParser(); 
    Map jsonData =parse.parseJson(value); 
    System.out.println((String)jsonData.get("e")); 
} 

Вот исключение я получаю:

Exception in thread "main" com.json.exceptions.JSONParsingException: @Key-Heirarchy::root[0]/ @Key:: COMMA or ] is expected. but found :[email protected]::5 
    at com.json.utils.JSONUtility.handleFailure(JSONUtility.java:124) 
    at com.json.parsers.JSONParser.stringLiteralTemplate(JSONParser.java:574) 
    at com.json.parsers.JSONParser.nonValidatingValueTemplate(JSONParser.java:698) 
    at com.json.parsers.JSONParser.jsonArrayTemplate(JSONParser.java:454) 
    at com.json.parsers.JSONParser.parseJson(JSONParser.java:170) 
    at parser.Scratch.main(Scratch.java:27) 

EDIT: Я также попытался Карта jsonData = parse.parseJson (значение .substring (3), чтобы начать с [но он все еще дает мне ошибку

+0

В нем указано, что часть входа не имеет ожидаемого разделителя. – wazy

+0

да, но это он в правильном формате, из того, что я могу сказать, поэтому я не знаю ** почему ** он говорит, что это не – sreya

+0

Похоже, вы добавляете по 1 строке каждые 2 readLine() внутри «значения» во время в то время как цикл. –

ответ

4

В дополнение к удалению ведущего // исправить свою петлю. Изменение

while(input.readLine()!=null) // skipping odd lines 
{ 
    value+=input.readLine(); // reading even lines 
} 

в

String line = null; 
while((line = input.readLine()) !=null) 
{ 
    value +=line; 
} 

или, лучше использовать StringBuilder как

String line = null; 
StringBuilder json = new StringBuilder(); 
while((line = input.readLine()) !=null) 
{ 
    json.append(line); 
} 
value = json.substring(3); // removes the leading "// " 

EDIT:
Я не знаком с JSON парсер. С помощью парсера Java org.json. вы можете сделать это так.

JSONArray jsonRoot = new JSONArray(value); 
JSONObject quote = jsonRoot.get(0); 
System.out.println ("e = " + quote.getString("e")); 

Но, как обходной путь вы могли бы лишить [] от StringBuilder в

// removes the leading "// [" and trailing "]" 
value = json.substring(4, json.length() - 1); 
+0

Пропуск строк с входа не проблема? –

+0

Извините, я полностью просмотрел это, спасибо, что указал на это, не могу поверить, что я все время повторяю эту ошибку. Теперь он работает, но возвращает null. Таким образом, он не разбирается правильно, любые предложения – sreya

+0

Какой парсер JSON вы используете? –

1

Этот json недействителен, имеет два «//».

Использование http://jsonlint.com/ для проверки этого

1

Ответ с этого URL начинается с //, который не является допустимым JSON:

// [{ "ID": "99624", "т": «CSCO», «e»: «NASDAQ», «l»: «24.00», «l_cur»: «24.00», «s»: «2», «ltt»: «4:00 PM EDT», «lt» : «25 июня, 4:00 вечера EDT», «c»: «-0.05», «cp»: «-0.21», «ccol»: «chr», «el»: «24.00», «el_cur»: 24,00 "," elt ":" 25 июня, 5:54 вечера EDT "," ec ":" 0.00 "," ecp ":" 0.00 "," eccol ":" chb "," div ":" 0.17 "," yld ":" 2.83 "}]

Согласно this и this, API Google Finance все равно устарел, поэтому вам может понадобиться найти что-то еще.

+0

Право, я также попробовал его с value.substring (3), чтобы запустить его на "[", но он все равно дает мне ошибку – sreya

+0

@sreya Какая ошибка? –

+0

Извините за исключение – sreya

0

Добавьте это в ваш код:

String line = null; 
    while((line = input.readLine()) !=null) 
    { 
     value += line; 
    } 
    value = value.replace("// ", ""); 

Вы должны заменить // в начале до «очистите» JSON, прежде чем вы сможете его разобрать.

+1

Удаление * все * '//' 'на входе - это не очень хорошая идея. –

+0

@brendan long, если вы проверите ввод, единственное вхождение происходит в начале, и я уверен, что это не повторится. – wazy

+1

Если вы посмотрите на конкретный случай ввода, то оно кажется * безопасным, но оно все еще слишком велико, и излишне увеличивает риск ошибок. Было бы безопаснее и эффективнее делать: 'if (value.startswith (" // ")) value = value.substr (2);'. –

-1

Кажется, вы используете старую версию парсинга quick-json. Используйте последнюю версию для разбора

быстрой JSON-1.0.2.3.jar

я мог видеть, что JSON приходит следующим образом,

// [ 
{ 
"id": "99624" 
,"t" : "CSCO" 
,"e" : "NASDAQ" 
,"l" : "25.41" 
,"l_cur" : "25.41" 
,"s": "2" 
,"ltt":"3:59PM EDT" 
,"lt" : "Jul 10, 3:59PM EDT" 
,"c" : "+0.25" 
,"cp" : "1.01" 
,"ccol" : "chg" 
,"el": "25.55" 
,"el_cur": "25.55" 
,"elt" : "Jul 10, 7:07PM EDT" 
,"ec" : "+0.14" 
,"ecp" : "0.55" 
,"eccol" : "chg" 
,"div" : "0.17" 
,"yld" : "2.68" 
} 
] 

Это не является допустимым JSON, он не должен предшествовать //

// [ 

удалить // и использовать только с [ до конца строки JSon

я был в состоянии успешно разобрать строку ниже JSon без //

[ 
{ 
"id": "99624" 
,"t" : "CSCO" 
,"e" : "NASDAQ" 
,"l" : "25.41" 
,"l_cur" : "25.41" 
,"s": "2" 
,"ltt":"3:59PM EDT" 
,"lt" : "Jul 10, 3:59PM EDT" 
,"c" : "+0.25" 
,"cp" : "1.01" 
,"ccol" : "chg" 
,"el": "25.55" 
,"el_cur": "25.55" 
,"elt" : "Jul 10, 7:07PM EDT" 
,"ec" : "+0.14" 
,"ecp" : "0.55" 
,"eccol" : "chg" 
,"div" : "0.17" 
,"yld" : "2.68" 
} 
] 

Ниже выход у меня есть с версией быстро JSon-1.0.2.3.jar

{root=[{e=NASDAQ, c=+0.25, div=0.17, l=25.41, lt=Jul 10, 3:59PM EDT, ec=+0.14, ltt=3:59PM EDT, elt=Jul 10, 7:07PM EDT, id=99624, yld=2.68, el_cur=25.55, t=CSCO, cp=1.01, s=2, el=25.55, l_cur=25.41, eccol=chg, ccol=chg, ecp=0.55}]} 
1

Следующий блог имеет достаточное количество очень хороших примеров для парсера quick-json

В нем также есть примеры других конкурентных парсеров

http://codesnippets4all.com/html/parsers/json/quick-json.htm

+1

Хороший источник. Попробуйте добавить соответствующий пример в свой ответ здесь. – MissingNumber