【问题标题】:Parsing JSON file in java在java中解析JSON文件
【发布时间】:2015-03-09 20:00:33
【问题描述】:

我是 JSON 和 Java 的新手,使用以下代码,我试图从文本文件中读取 JSON 数据,但它没有显示多值数据的结果

任何人请帮助我,让我知道我错在哪里

    JSONParser parser = new JSONParser();              
    try {  
     Object obj = parser.parse(new FileReader("C:/Users/Desktop/file.json"));  
     JSONObject jsonObject = (JSONObject) obj;  
     String K1= (String) jsonObject.get("V1");  
     String K2= (String) jsonObject.get("V2"); 



     System.out.println(V1);
      System.out.println(V2);

       JSONArray K3= (JSONArray) jsonObject.get("K3");

       for (Object c : K3)
       {
         System.out.println(c+"");

       }
 } catch ( Exception e){
                 e.printStackTrace();

 }  
}
}


File.json
{"K1":"V1" ,"K2":"V2" ,"K3" : "V3.1 ,V3.2"}

电流输出: V1 V2

预期输出 V1 V2 V3.1 V3.2

请告诉我哪里错了

【问题讨论】:

  • 你实际得到了什么输出?它是否抛出异常?如果是这样,请在您的问题中发布
  • @Alex,它没有显示任何异常,它给出了完美的答案,但我担心的是,如果不是 JSON 字符串,我想从 JSON 文件中读取相同的数据,那么应该如何在这里完成,我是新手,所以我很困惑,我也有谷歌但没有得到它
  • A JSON 实际上是 String 遵循您在问题中已经发布的模式。如果您想从文件中读取它,请使用 BufferedReader 或其他东西从文件中读取它,然后使用 JSON_DATA String 执行您已经完成的操作。
  • 我想你应该看看这个:stackoverflow.com/questions/10926353/…
  • Parse JSON in JavaScript?的可能重复

标签: java json


【解决方案1】:

您要么进行手动解析,要么进行反序列化。我都没有看到。目前,您可以进行手动解析。 应该有点像

JSONParser parser=new JSONParser();
String s = "[0,{\"1\":{\"2\":{\"3\":{\"4\":[5,{\"6\":7}]}}}}]";
Object obj = parser.parse(s);

【讨论】:

  • @Code 对 this 有帮助
【解决方案2】:

使用以下示例从文本文件中读取数据。

http://www.mkyong.com/java/how-to-read-file-from-java-bufferedreader-example/

不要在代码中为“JSON_DATA”变量硬编码值,而是在上面的代码段中使用“sCurrentLine”中的值。

【讨论】:

    【解决方案3】:

    我发现以面向对象的方式解析 JSON 数据会更好。这意味着将数据绑定到 Java Bean,这对您的工作非常方便。首先让我说这需要一个 JAR,即 gson.jar

    1. 定义 GeoData 类以仅表示地理数据

      公共类地理数据{

              private String id;
              private String name;
              private String latitude;
              private String longitude;
              public String getId() {
                  return id;
              }
              public void setId(String id) {
                  this.id = id;
              }
              public String getName() {
                  return name;
              }
              public void setName(String name) {
                  this.name = name;
              }
              public String getLatitude() {
                  return latitude;
              }
              public void setLatitude(String latitude) {
                  this.latitude = latitude;
              }
              public String getLongitude() {
                  return longitude;
              }
              public void setLongitude(String longitude) {
                  this.longitude = longitude;
              }
      
          }
      

    接下来构建一个包装器,其中包含一个 GeoData 列表。匹配您的输入。请注意,您的输入文件有 geodata 键,带有 GeoData 列表(您提供的示例)

    public class GeoDataHolder {
    
        GeoData[] geodata;
    
        public GeoData[] getGeodata() {
            return geodata;
        }
    
        public void setGeodata(GeoData[] geodata) {
            this.geodata = geodata;
        }
    }
    

    最后是一个解析文件的例子:

    public static void main(String[] args) throws FileNotFoundException {
            //read the file
            JsonReader reader = new JsonReader(new BufferedReader(new InputStreamReader(new FileInputStream(new File("F:\\workspace\\Parser\\geodata.xml")))));
            Gson gson = new Gson();
            GeoDataHolder response = gson.fromJson(reader, GeoDataHolder.class);
            //geodataholder is the root element
            System.out.println("size: " + response.getGeodata().length);
    
            for(int i=0;i<response.getGeodata().length;i++){
                System.out.println("size: " + response.getGeodata()[i].getName());
            }
        }
    

    【讨论】:

      【解决方案4】:

      有些行应该进入while loop,因为当循环结束时sCurrentLine 为空。所以没有什么要解析的,然后NullPointerException 会被抛出。每行也应该有这个模式:{"Key":"Value"}

      public class Address {
        public static void main(String[] args) throws JSONException {
          BufferedReader br = null;
      
          try {
      
              String sCurrentLine;
      
              br = new BufferedReader(new FileReader("C:/Users/Desktop/101.txt"));
      
              while ((sCurrentLine = br.readLine()) != null) {
                  System.out.println(sCurrentLine);
                  final JSONObject obj = new JSONObject(sCurrentLine);
                  final JSONArray geodata = obj.getJSONArray("geodata");
                  final int n = geodata.length();
                  for (int i = 0; i < n; ++i) {
                    final JSONObject person = geodata.getJSONObject(i);
                    System.out.println(person.getInt("id"));
                    System.out.println(person.getString("name"));
                    System.out.println(person.getString("gender"));
                    System.out.println(person.getDouble("latitude"));
                    System.out.println(person.getDouble("longitude"));
                  }
              }     
      
           } catch (IOException e) {
               e.printStackTrace();
           } finally {
             try {
               if (br != null)br.close();
              } catch (IOException ex) {
               ex.printStackTrace();
              }
           }
      }
      }
      

      【讨论】:

      • @ super hornet,我试过你的代码在线程“main”org.json.JSONException中显示以下errorException:JSONObject文本必须在org.json.JSONTokener的字符1处以'}'结尾.syntaxError(JSONTokener.java:410) at org.json.JSONObject.(JSONObject.java:185) at org.json.JSONObject.(JSONObject.java:402)
      • 你需要发布你试图解析的文本文件内容
      • @Super Hornet 我没听懂你。请解释一下
      • 我的意思是101.txt的内容
      • 好的,如果我错了,请纠正我,这意味着我必须以字符串形式获取内容,然后继续,对吗?我们不能只读取 JSON 文件并打印其单个元素,例如“Id : 1”等等
      猜你喜欢
      • 2016-04-05
      • 2019-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多