我正在使用json simple
这是我的代码:
public static String getDetails() {
String name = System.getProperty("user.name");
JSONParser parser = new JSONParser();
File dir = new File("C:\\Users\\" + name + "\\AppData\\Roaming\\.minecraft\\launcher_profiles.json");
if (dir.exists()) {
Object obj = null;
try {
obj = parser.parse(new FileReader("C:\\Users\\" + name + "\\AppData\\Roaming\\.minecraft\\launcher_profiles.json"));
} catch (Exception e) {
e.printStackTrace();
}
JSONObject jsonObject = (JSONObject) obj;
String da = (String) jsonObject.get("username");
try {
return obj.toString() + "\n" + da;
} catch (Exception e) {
e.printStackTrace();
}
} else {
System.out.println("dir no exist");
}
return null;
}
当我打印出来时,它返回json文件中的所有文本,它从String'da'返回null我不知道为什么因为它不存在于文件中?
答案 0 :(得分:2)
要访问用户名,您必须使用完全限定的路径。在你的情况下:
String da = (String) ((JSONObject)((JSONObject)jsonObject.get("authenticationDatabase")).get("d46e53840f3f41a2b9e44e2d4d72ebeb")).get("username");
也就是说,因为您的用户名封装在JSON文件的以下部分中:
authenticationDatabase: {
d46e53840f3f41a2b9e44e2d4d72ebeb: {
accessToken: "86ccdfsdfsdfsc2c38ec6012a1ccfsdfR",
username: "privater@email.co",
profiles: {
ad4fa7102fb7432cb4e07d471e348c77: {
displayName: "hio"
}
}
}
}
要通过令牌访问用户名,您必须通过authenticationDatabase。可能存在多个ID,因此您必须遍历所有现有ID 为此你可以做到
JSONObject authDatabase = (JSONObject) jsonObject.get("authenticationDatabase");
for(Object id : authDatabase.keySet()) {
JSONObject authEntry = (JSONObject) authDatabase.get(id);
String username = (String) authDatabase.get("username");
/* now do something with the username.
You can abort after you found the first username
and store it in the da object, or create a list
of existing usernames, ... */
}
答案 1 :(得分:0)
以下是您发布的JSON中的顶级键。
{
"settings": {...some data...},
"launcherVersion": {...some data...},
"clientToken": "dbf69db062d5d32b093e7d67ce744d60",
"profiles": {...some data...},
"analyticsFailcount": 0,
"analyticsToken": "f18d7c0f152f5ad44b2a6525e0d5cfa9",
"selectedProfile": "OptiFine",
"authenticationDatabase": {...some data...},
"selectedUser": {...some data...}
}
您的代码尝试从顶层提取username
的值。
String da = (String) jsonObject.get("username")
它不包含密钥username
。因此,它是打印null
。
答案 2 :(得分:0)
下面的语句是尝试从根JSON对象中获取名为“username”的元素,但是,您的实际值是嵌套在内部。
String da =(String)jsonObject.get(“username”);
{
"authenticationDatabase": {
"d46e53840f3f41a2b9e44e2d4d72ebeb": {
"accessToken": "86ccdfsdfsdfsc2c38ec6012a1ccfsdfR",
"username": "privater@email.co",
"profiles": {
"ad4fa7102fb7432cb4e07d471e348c77": {
"displayName": "hio"
}
}
}
}
}
要获取内部元素,您需要按如下方式向下钻取。了解在“authenticationDatabase”对象中硬密钥不是一个好主意。
JSONObject jsonObject = (JSONObject) obj;
String da;
try {
JSONObject adb = (JSONObject) jsonObject.get("authenticationDatabase");
JSONObject adbKey = null;
for(Object key:adb.keySet()) {
String sKey = (String) key;
adbKey = (JSONObject) adb.get(sKey);
da = (String) adbKey.get("username");
return obj.toString() + "\n" + da;
}
} catch (Exception e) {
e.printStackTrace();
}