我使用了一个Json文件来保存用户的一些信息,代码如下:
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:
{"users":[
{"files":[],
"token":"XXXX",
"email":"XXXX"}
]
}然后我尝试用上面的代码在files[]数组中添加一些信息:
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文件现在显示了我想要的内容:
{"users":[
{"files":[
{"name":"d9f6cd671a384fe59bae29e2718463b5",
"type":"Apresentação",
"date":Sat Feb 09 13:48:32 GMT-03:00 2013}
],
"email":"XXXX",
"token":"XXXX"
}
]
}在这里之前没问题。但是当我尝试使用JSONParser再次加载我的json的第一个代码时,它无法读取,为什么??一切似乎都很好:
发布于 2013-02-10 03:21:46
日期应用引号括起来
{
"users": [{
"files":[{
"name":"d9f6cd671a384fe59bae29e2718463b5",
"type":"Apresentação",
"date":"Sat Feb 09 13:48:32 GMT-03:00 2013"
}],
"email":"XXXX",
"token":"XXXX"
}]
}发布于 2013-02-10 04:16:02
我假设格式错误的日期字符串是一个打字错误,因为库不会生成该输出。我注意到您正在编写的代码点的值超出了U+007F。
FileWriter fileWriter = new FileWriter(file);在不使用Unicode转换格式(UTF)作为其缺省编码的任何系统上,上述代码行都是有缺陷的。The documentation声明:
该类的构造函数假定默认的字符编码
FileReader中也存在同样的问题。这两种类型都应该避免。
JSON mandates Unicode:
JSON文本应采用Unicode编码。默认编码为UTF-8。
如果需要将字符数据直接提供给正在使用的JSON API,则必须指定编码。
阅读:
try (InputStream in = new FileInputStream(filename);
Reader reader = new InputStreamReader(in, StandardCharsets.UTF_8)) {
// read from stream
}写作:
try (OutputStream out = new FileOutputStream(filename);
Writer writer = new OutputStreamWriter(out, StandardCharsets.UTF_8)) {
// write to stream
}这是Java7代码,但同样的原则也适用于早期版本。有关在here中进行字符编码的粗略指南,请参阅Java。读取机制是不完整的,因为它没有检测到正在使用哪个UTF -有关必要的字节模式检测,请参阅the spec。
正如一位评论者所指出的,说“它不工作!”是不够的--你必须详细说明失败的本质。Java开发人员期望错误堆栈跟踪。
https://stackoverflow.com/questions/14790527
复制相似问题