2016-06-14 3 views
4

Так что у меня возникают проблемы с чтением Json-файла на Java.Чтение json-файла в Java

Это файл Json с содержанием в этом формате:

{ 
    "_id": 2864071, 
    "name": "Neustadt", 
    "country": "DE", 
    "coord": { 
    "lon": 12.56667, 
    "lat": 52.400002 
    } 
} 

Это код, я использую:

package controllers; 


@Named(value = "cityID") 
@SessionScoped 
public class getCityIDs implements Serializable { 



    public long getCityIDs(String name) { 

     //Read the json file 

     try { 

      FileReader reader = new FileReader(filePath); 

      JSONParser parser = new JSONParser(); 
      JSONObject jsonObject = (JSONObject) parser.parse(reader); 

      // get a number from the JSON object 

      String travelName = (String) jsonObject.get("name"); 

      if(travelName.equals(name)){ 
       long id = (long) jsonObject.get("_id"); 
       System.out.println(id); 
       return id; 
      } else { 
       System.out.println("else"); 
       return 0; 
      } 

     } catch (FileNotFoundException ex) { 
      Logger.getLogger(getCityIDs.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (IOException | ParseException ex) { 
      Logger.getLogger(getCityIDs.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     System.out.println("einde functie"); 
     return 0; 
     // JSONObject jsonObject = (JSONObject) parser.parse(getClass().getResource("/json/city.list.json").toString()); 
    } 

    public String test(){ 
     return "hello world"; 
    } 
} 

Однако, это дает мне ошибку на этой линии:

JSONObject jsonObject = (JSONObject) parser.parse(reader); 

существо:

Severe: Unexpected token LEFT BRACE({) at position 88. 
    at org.json.simple.parser.JSONParser.parse(Unknown Source) 
    at org.json.simple.parser.JSONParser.parse(Unknown Source) 
    at controllers.getCityIDs.getCityIDs(getCityIDs.java:45) 

По какой-то причине он не может прочитать путь к файлу? "Неизвестный источник"? Я не уверен, что я делаю неправильно.

Метод просто возвращает «0», когда я вызываю метод в другом классе, с именем страны «Neustadt». В основном я хочу, чтобы эта функция возвращала идентификатор для определенного города. Имена хранятся в Json вместе с идентификатором.

Редактировать: В идеале я хочу, чтобы иметь возможность анализировать JSON-файл, который находится внутри проекта. Я попытался использовать .getClass(). GetResource ("/ path/to/json"); но это совсем не сработало.

EDIT: FIXED

package controllers; 

import java.io.BufferedReader; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.Serializable; 
import java.net.URL; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.enterprise.context.RequestScoped; 
import javax.enterprise.context.SessionScoped; 
import javax.inject.Named; 
import org.json.simple.JSONObject; 
import org.json.simple.parser.JSONParser; 
import org.json.simple.parser.ParseException; 

@Named(value = "cityID") 
@SessionScoped 
public class getCityIDs implements Serializable{ 



    JSONObject jsonObject; 
    public long getCityIDs(String name) { 

     try { 

      JSONParser parser = new JSONParser(); 

      InputStream in = getClass().getResourceAsStream("/dataSteden/stedenNamen1.json"); 

      try (BufferedReader br = new BufferedReader(new InputStreamReader(in))) { 
      String line; 
      while ((line = br.readLine()) != null) { 
       jsonObject = (JSONObject) parser.parse(line); 
       } 
      } 

      String travelName = (String) jsonObject.get("name"); 
      System.out.println("stad: " +travelName); 
      System.out.println("testttt"); 
      if(travelName.equals(name)){ 
       long id = (long) jsonObject.get("_id"); 
       System.out.println(id); 
       return id; 
      } else { 
       System.out.println("else"); 
       return 5; 
      } 

     } catch (FileNotFoundException ex) { 
      Logger.getLogger(getCityIDs.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (IOException | ParseException ex) { 
      Logger.getLogger(getCityIDs.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     System.out.println("einde functie"); 
     return 0; 
     // JSONObject jsonObject = (JSONObject) parser.parse(getClass().getResource("/json/city.list.json").toString()); 
    } 

    public String test(){ 
     return "hello world"; 
    } 
} 
+0

Неизвестный источник означает, что у вас есть исходный код для простой библиотеки JSON. Кроме того, попробуйте придерживаться правил именования переменных Java. Ваш класс не следует называть 'getCityIds'. Метод может быть, однако. –

+0

Я не уверен, что вы имеете в виду с первой строкой – aze45sq6d

+0

Не беспокойтесь об этом. Java stacktrace пытается предоставить вам номера строк и имена файлов для библиотеки JSON, которые вы используете, и это невозможно. Это то, что означает «Неизвестный источник» в этом выпуске. Что касается фактической ошибки, вы показали действительный JSON, поэтому я не понимаю, почему вы получаете эту ошибку. –

ответ

5

Ваши данные строки разделителями

{"_id":707860,"name":"Hurzuf","country":"UA","coord":{"lon":34.283333,"lat":44.549999}} 
{"_id":519188,"name":"Novinki","country":"RU","coord":{"lon":37.666668,"lat":55.683334}} 
{"_id":1283378,"name":"Gorkhā","country":"NP","coord":{"lon":84.633331,"lat":28}} 

Таким образом, вы не можете бросить весь файл в JSONParser, вы должны прочитать файл построчно в каждом конкретном line и проанализировать каждую строку как JSONObject, из которой вы можете извлечь нужные значения ключа.

+0

Большое спасибо! Теперь мне интересно, файл находится в моем проекте. Я не хочу называть его локально на своем компьютере, поскольку в этом проекте больше людей. Но я не могу это сделать. В идеале я хочу что-то вроде этого: FileReader reader = new FileReader (this.getClass(). GetResource ("/ json/city.list.json")); – aze45sq6d

+0

Справа. До тех пор, пока у вас есть этот файл, расположенный в какой-либо папке json в корневой папке src/project, я думаю, что у вас там есть работа –

+0

Я положил его в Source Packages и назову его следующим: Чтение FileReader = new FileReader (this.getClass().. GetResource ("/ JSON/city.list") ToString()); Но он дает мне nullpointerexception, он работает, когда вы вызываете его локально, вызывая его по строке – aze45sq6d