如何使用Java读取JSON数据

问题描述:

在读取/解析Java中的以下JSON字符串时遇到问题。如何使用Java读取JSON数据

代码:

try{ 
    json = new JSONObject(result); 
//json now looks like this :- 
// {'header': '[{"doc_no": "DN00001","stage":"P"}]','section':'[{"upper":100,"lower":1]'} 
    if (json != null){ 
    // this line is throwing an exception!! 
    JSONObject header = new JSONObject("header"); 
    }catch(JSONException e){ 
    // Error Message 
} 

我也试过这样:

JSONArray header = json.getJSONArray("header"); 

,但仍然抛出一些例外。

我错过了什么?

+1

哪个例外? – hvgotcodes 2012-07-18 12:51:12

+1

我想你需要从变量'json'中获得'header'字段。创建新的JSONObject看起来很奇怪。 – nhahtdh 2012-07-18 12:52:55

这里花花公子拿这段代码。修复你的JSON字符串,如果你想从中获得JSONObject

public static void main(String[] args) throws JSONException { 
    String result = "{'header': '[{\"doc_no\": \"DN00001\",\"stage\":\"P\"}]','section':'[{\"upper\":100,\"lower\":1]'}"; 
    JSONObject json = new JSONObject(result); 
    // json now looks like this :- 
    // 
    if (json != null) { 
     String header = json.getString("header"); 
     System.out.println(header); 
    } 

} 

那么你怎么了?几件事:

  1. 您的JSON字符串是非法的。感谢解析器支持你。它应该是

    { 
        "header": [{"doc_no": "DN00001","stage":"P"}], 
        "section":[{"upper":100,"lower":1] 
    } 
    
  2. 它不会独自解决您的问题。既然你想得到JSONObject,但你提供了JSONArray(你为什么这么做?)。所以删除那些方括号。

  3. 还是不高兴。你看到你试图创建一个新的JSONObject通过做(明显)new JSONObject("header")使用字符串taht不是JSON。 9,期待它不会抛出错误?多残忍。)另外你想get而不是set。所以使用json.getXXX("header")其中XXX可以是String,JSONObjectJSONArray等等。

+0

太棒了,但如果你读我的问题,我也试图得到JSONArray(“标题”)没有运气,虽然好指针... – gath 2012-07-18 14:15:20

+0

@gath老兄,你需要修复你的JSON字符串像# 1。如果你想要'JSONArray',跳过#2。在#3中,使用'json.getJSONArray(“header”);'。 – Nishant 2012-07-18 14:29:40

+0

尽管每个人都给了一个指向正确方向的指针,即json字符串格式不正确,但我会选择这个答案作为其广泛的解释。谢谢大家,我的服务器(在Python中)没有正确格式化JSON,我修改了它,现在JSON中的所有键都带有双引号{“header”:[{“doc_no”:“DN00001”}]}。 – gath 2012-07-19 05:48:12

这不是有效的JSON文件。

'header': '[{"doc_no": "DN00001","stage":"P"}]' 

阵列无法与'
字符串包围应"而不是'

包围阅读http://json.org/有关JSON语法。

+2

为什么它不是一个有效的JSON。这是一个有效的JSON,其关键'标题'和值为* string * [{“doc_no”:“DN00001”,“stage”:“P”}],这不是严格有效的,但大部分解析器都可以工作。 – Nishant 2012-07-18 12:56:32

+1

“不严格有效”意味着它是无效的 - 一些解析器可能执行较少 – 2012-07-18 12:58:51

+0

然后它应该用'''而不是''包围起来 – pawelzieba 2012-07-18 12:58:53

JSONObject header = new JSONObject("header");

不要你的意思是得到json头,而不是创建一个新的JSONObject

JSONObject header = json.get("header");

JSONObject header = new JSONObject("header"); 

您的意思是从现有对象中获取的 “头” 场?

JSONObject header = json.getJSONObject("header"); 

但是从您的评论来看

// {'header': '[{"doc_no": "DN00001","stage":"P"}]','section':'[{"upper":100,"lower":1]'} 

您打算“头”是一个数组(不是对象),但数据有它作为一个字符串(看起来像一个数组)所以您可能需要修复JSON以及Java代码。