无法解析jsonobject ----“JSONObject文本必须以'{'的字符1开头”

时间:2014-07-24 06:40:55

标签: java json

String json = "{'name': 'Tom','array':[{'a':'111','b':'222','c':'333'},{},{'a':'999'}],'address':'York'}";

try {
    JSONObject jsonObject = JSONObject.fromObject(json);
    String name = jsonObject.getString("name");
    String address = jsonObject.getString("address");
    System.out.println("name is:" + name);
    System.out.println("address is:" + address);
    JSONArray jsonArray = jsonObject.getJSONArray("array");
    for (int i = 0; i < jsonArray.size(); i++) {
        System.out.println("item " + i + " :" + jsonArray.getString(i));
    }
} catch (JSONException e) {
    e.printStackTrace();
}

一切都好。 但是当我将{'name': 'Tom','array':[{'a':'111','b':'222','c':'333'},{},{'a':'999'}],'address':'York'}放入文件时。

        File file = new File(fileName);  
        BufferedReader reader = null;           
        try {  
            reader = new BufferedReader(new FileReader(file));  
            String tempString = null;  
            while ((tempString = reader.readLine()) != null){                   
                JSONObject jo = JSONObject.fromObject(tempString.trim());
                String id = jo.getString("id");
                String name = jo.getString("name");
                log.info(id + ":" + name);
            }  
            reader.close();  
        } catch (IOException e) {  
            e.printStackTrace();  
        } 

它告诉我Exception in thread "main" net.sf.json.JSONException: A JSONObject text must begin with '{' at character 1 of "{'name': 'Tom','array':[{'a':'111','b':'222','c':'333'},{},{'a':'999'}],'address':'York'}。这段代码有什么问题?有什么可以解决的吗?感谢。

我的档案:

{'name': 'Tom','array':[{'a':'111','b':'222','c':'333'},{},{'a':'999'}],'address':'York'}

3 个答案:

答案 0 :(得分:2)

来自评论:

  

我用

InputStreamReader isr = new InputStreamReader(new FileInputStream(fileName), "UTF-8");
reader = new BufferedReader(isr);
String tempString = null;
while ((tempString = reader.readLine()) != null){
     

,我的文件以EE BB BF开头,我查了一下。

问题是该文件以BOM开头。 JSON解码器期望文件以一个可以启动JSON类型的字符开头,但它正在获得U + FEFF。

如果JSON文件没有以BOM开头,那将是最好的。

如果你必须处理这种情况,那么你可以使用缓冲区:

BufferedReader buf = new BufferedReader(isr);
// remove BOM
buf.mark(1);
if(buf.read() != '\uFEFF') {
  buf.reset();
}
// continue...

答案 1 :(得分:0)

如果查看错误" {'name': 'Tom','array':[{'a':'111','b':'222','c':'333'},{},{'a':'999'}],'address':'York'}"中返回的字符串,您会在字符1中看到实际存在空格。如果您尝试从文件中删除此空间会发生什么?

答案 2 :(得分:0)

您必须使用双引号'替换单引号"

{
    "name": "Tom",
    "array": [
        {
            "a": "111",
            "b": "222",
            "c": "333"
        },
        {

        },
        {
            "a": "999"
        }
    ],
    "address": "York"
}

根据JSON规范http://www.ietf.org/rfc/rfc4627.txt

中的定义
  

字符串的表示类似于C中使用的约定      编程语言家族。字符串的开头和结尾      引号。

quotation mark表示"