![](/img/trans.png)
[英]Read JSON file with JSONParser not available in the jarfile
[英]JSONParser can't read a JSON file
我正在使用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時,無法讀取它,為什么? 一切似乎都很好:(
日期應用引號引起來
{
"users": [{
"files":[{
"name":"d9f6cd671a384fe59bae29e2718463b5",
"type":"Apresentação",
"date":"Sat Feb 09 13:48:32 GMT-03:00 2013"
}],
"email":"XXXX",
"token":"XXXX"
}]
}
我假設格式錯誤的日期字符串是一個錯字,因為該庫不會產生該輸出。 我注意到您正在編寫代碼值超過U + 007F的代碼點。
FileWriter fileWriter = new FileWriter(file);
在不使用Unicode轉換格式(UTF)作為默認編碼的任何系統上,上面的行都是有缺陷的。 該文檔指出:
此類的構造函數假定默認字符編碼
FileReader
存在相同的問題。 兩種類型都應避免。
JSON 強制使用 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
}
這是Java 7代碼,但相同的原理也適用於早期版本。 有關Java字符編碼的簡要指南,請參見此處 。 讀取機制不完整,因為它無法檢測到正在使用哪個UTF-有關必要的字節模式檢測,請參閱規范 。
正如評論員指出的那樣,僅僅說“它不起作用!”是不夠的。 -您必須詳細說明故障的性質。 Java開發人員期望錯誤堆棧跟蹤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.