从json文件获取字符串时为空

时间:2018-03-12 20:05:26

标签: java json

我正在使用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我不知道为什么因为它不存在于文件中?

JSON文件:https://hastebin.com/sirefacado.json

3 个答案:

答案 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();
    }