首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSONParser无法读取JSON文件

JSONParser无法读取JSON文件
EN

Stack Overflow用户
提问于 2013-02-10 01:08:14
回答 2查看 1.2K关注 0票数 0

我使用了一个Json文件来保存用户的一些信息,代码如下:

代码语言:javascript
复制
Login login = new Login(email, token, jsessionId);

            JSONObject jsonObj = new JSONObject();

            JSONObject userDetail = new JSONObject();

            JSONArray listFiles = new JSONArray();

            userDetail.put("email", email);
            token = EncodeUtil.encode(token);
            userDetail.put("token", token);
            userDetail.put("files", listFiles);

            try {

                if (!(file.exists())) {

                    JSONArray userDetails = new JSONArray();
                    userDetails.add(userDetail);
                    jsonObj.put("users", userDetails);

                    FileWriter fileWriter = new FileWriter(file);
                    fileWriter.write(jsonObj.toString());
                    fileWriter.flush();
                    fileWriter.close();

                } else {

                    boolean emailExists = true;

                    JSONParser parser = new JSONParser();
                    Object obj = parser.parse(new FileReader(file));
                    JSONObject jsonObjReader = (JSONObject) obj;
                    JSONArray jsonArrayWriter = (JSONArray) jsonObjReader.get("users");
                    int length = jsonArrayWriter.size();
                    for (int i = 0; i < length; i++) {
                        Object currentObj = jsonArrayWriter.get(i);
                        JSONObject currentJson = (JSONObject) currentObj;
                        String email2 = (String) currentJson.get("email");
                        if (email2.equals(email)) {
                            emailExists = true;
                        } else {
                            emailExists = false;
                        }
                    }

                    if (!emailExists) {
                        jsonArrayWriter.add(userDetail);
                        jsonObj.put("users", jsonArrayWriter);
                        FileWriter fileWriter = new FileWriter(file);
                        fileWriter.write(jsonObj.toString());
                        fileWriter.flush();
                        fileWriter.close();
                    }
                }

            } catch (Exception e) {

                Logger.getLogger(LoginLocalServiceImpl.class.getName()).log(Level.SEVERE, e.getMessage());

                throw new PortalException("Erro ao ler Json File");
            }

它工作得很好,并用这个结构返回给我一个JSON:

代码语言:javascript
复制
{"users":[
      {"files":[],
       "token":"XXXX",
       "email":"XXXX"}
     ]
}

然后我尝试用上面的代码在files[]数组中添加一些信息:

代码语言:javascript
复制
try {

                JSONObject fileRef = new JSONObject();
                fileRef.put("date", date);
                fileRef.put("type", type);
                fileRef.put("name", name);

                JSONParser parser = new JSONParser();
                Object obj = parser.parse(new FileReader(file));

                JSONObject jsonObjReader = (JSONObject) obj;
                JSONArray jsonArrayUsers = (JSONArray) jsonObjReader.get("users");

                for (int i = 0; i < jsonArrayUsers.size(); i++) {
                    JSONObject jsonTest = (JSONObject) jsonArrayUsers.get(i);
                    String emailTest = (String) jsonTest.get("email");
                    if (emailTest.equals(email)) {
                        JSONArray jsonArrayFiles = (JSONArray) jsonTest.get("files");
                        jsonArrayFiles.add(fileRef);
           //             jsonTest.put("files", jsonArrayFiles);
           //             jsonArrayUsers.add(jsonTest);
           //             jsonObjReader.put("users", jsonArrayUsers);

                        //            System.out.println(jsonArrayFiles.toString());

                    }
                }
                FileWriter fileWriter = new FileWriter(file);
                fileWriter.write(jsonObjReader.toString());
                fileWriter.flush();
                fileWriter.close();

            } catch (IOException ex) {
                Logger.getLogger(MainViewController.class.getName()).log(Level.SEVERE, null, ex);
            } catch (ParseException ex) {
                Logger.getLogger(MainViewController.class.getName()).log(Level.SEVERE, null, ex);
            }

我的json文件现在显示了我想要的内容:

代码语言:javascript
复制
{"users":[
      {"files":[
            {"name":"d9f6cd671a384fe59bae29e2718463b5",
             "type":"Apresentação",
             "date":Sat Feb 09 13:48:32 GMT-03:00 2013}
           ],
       "email":"XXXX",
       "token":"XXXX"
      }
     ]
}

在这里之前没问题。但是当我尝试使用JSONParser再次加载我的json的第一个代码时,它无法读取,为什么??一切似乎都很好:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-10 03:21:46

日期应用引号括起来

代码语言:javascript
复制
{
    "users": [{
        "files":[{
            "name":"d9f6cd671a384fe59bae29e2718463b5",
            "type":"Apresentação",
            "date":"Sat Feb 09 13:48:32 GMT-03:00 2013"
        }],
        "email":"XXXX",
        "token":"XXXX"
    }]
}
票数 4
EN

Stack Overflow用户

发布于 2013-02-10 04:16:02

我假设格式错误的日期字符串是一个打字错误,因为库不会生成该输出。我注意到您正在编写的代码点的值超出了U+007F。

代码语言:javascript
复制
FileWriter fileWriter = new FileWriter(file);

在不使用Unicode转换格式(UTF)作为其缺省编码的任何系统上,上述代码行都是有缺陷的。The documentation声明:

该类的构造函数假定默认的字符编码

FileReader中也存在同样的问题。这两种类型都应该避免。

JSON mandates Unicode:

JSON文本应采用Unicode编码。默认编码为UTF-8。

如果需要将字符数据直接提供给正在使用的JSON API,则必须指定编码。

阅读:

代码语言:javascript
复制
try (InputStream in = new FileInputStream(filename);
     Reader reader = new InputStreamReader(in, StandardCharsets.UTF_8)) {
  // read from stream
}

写作:

代码语言:javascript
复制
try (OutputStream out = new FileOutputStream(filename);
     Writer writer = new OutputStreamWriter(out, StandardCharsets.UTF_8)) {
  // write to stream
}

这是Java7代码,但同样的原则也适用于早期版本。有关在here中进行字符编码的粗略指南,请参阅Java。读取机制是不完整的,因为它没有检测到正在使用哪个UTF -有关必要的字节模式检测,请参阅the spec

正如一位评论者所指出的,说“它不工作!”是不够的--你必须详细说明失败的本质。Java开发人员期望错误堆栈跟踪。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14790527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档