2016-06-14 60 views
4

所以我在阅读Java中的Json文件时遇到了麻烦。阅读Java中的json文件

它与内容的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”。 基本上所有我想要的是这个函数返回某个城市的ID。 名称与ID一起存储在Json中。

编辑: 理想情况下,我想能够解析JSON文件,它位于项目内部。我试过使用.getClass()。getResource(“/ path/to/json”);但这根本不起作用。

编辑:固定

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

未知的来源意味着您确实拥有simpleJSON库的源代码。另外,尝试坚持使用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,你必须读取文件中的行逐并将每行解析为JSONObject,从中可以提取出所需的键值。

+0

万分感谢! 现在我想知道,该文件位于我的项目。 我不想在本地计算机上调用它,因为有更多的人在这个项目上工作。但我似乎无法做到。理想情况下,我想要这样的东西:FileReader reader = new FileReader(this.getClass()。getResource(“/ json/city.list.json”)); – aze45sq6d

+0

对。只要你有该文件位于该项目的src /文件夹根目录下的某个json文件夹中,我认为你在那里应该可以工作 –

+0

我把它放在Source Packages下,并且这样称呼它: FileReader reader =新的FileReader(this.getClass())。。的getResource( “/ JSON/city.list”)的toString()); 但是它给了我一个nullpointerexception,它现在在本地调用它的时候就起作用,一行一行地调用它 – aze45sq6d