使用JSON文件的用户登录



我正在尝试创建一个用户登录程序,其中现有的用户名和密码存储在JSON文件中,但是我很难从文件中检索用户名和密码进行比较。我的JSON文件设置如下:

[{"username"robert"password_hash"2 d559ca435bbe90d965492bf8187243d6a611e6fece6e7467f4a0a1cfdd91879"},{"username"john"password_hash"1 fefaaaceda5a7e199e2c612ca6716d6da8065eed5a1a50979a309f27797e01f"},{"username"juan","password_hash"965701 cd196ff52123c759efeb9821d5f08d2647a912577bf5aa4aaf58cf75be"},{"username"annie","password_hash"ccdb84ebe2a9bc6894fd2f441ea56cb5a51e76737a1067e1e9a00bdee6896e64"},{"username"jackie","password_hash"26 ff6fed929876a8c83dd8f548bcb97aeadf5dace7d67849fc144420f41177ce"})

我设置的测试代码如下:

public static void credentialCheck(String existingUsername, String sha256hexEntrdPaswrd){ 

//Checks Validity of User's Credentials
boolean validUser = false;

JSONArray userArray = new JSONArray();
Object ob = null;
JSONParser jsonParser = new JSONParser();


try {
FileReader file = new FileReader("JSONUserLoginProject.json");
ob = jsonParser.parse(file);
userArray = (JSONArray) ob;
System.out.println(userArray.get(1));
file.close();
} //end try-block
catch(FileNotFoundException e) {e.printStackTrace();}
catch(IOException e) {e.printStackTrace();}
catch(ParseException e) {e.printStackTrace();}
catch(Exception e) {e.printStackTrace();}
}

当输入用户名和密码时,输出如下:

{"password_hash"1 fefaaaceda5a7e199e2c612ca6716d6da8065eed5a1a50979a309f27797e01f","username":"john"}

但是,我想单独检索用户名和密码,使用概念上类似于 的东西

System.out.println(userArray.get("Username")输出和System.out.println(userArray.get("password_hash")输出:26ff6fed929876a8c83dd8f548bcb97aeadf5dace7d67849fc144420f41177ce

但是当然代码是正确的

你想做的,不会工作,因为JSON数组包含对象,而不是键,值项。

解决这个问题的最快和最好的方法是创建一个包含所需数据的JavaClass
public class UserData
{
private String username;
private String passwordHash;

// Constructors, getters, setters
}

然后将数据读入UserData对象数组。

List<UserData> listWithUsers = new ArrayList<>(); // Creating the list with users
for (int i = 0 ; i < userArray.length(); i++) // iterating over each JSON object in your array
{
JSONObject userJsonObject = userArray.getJSONObject(i);
UserData currUser = new UserData();
currUser.setUsername(userJsonObject.get("username")); // Getting the username From the Json object
currUser.setPasswordHash(userJsonObject.get("password_hash")); // Same thing for passwordHash

listWithUsers.add(currUser);
}

然后最重要的一步,当用户尝试登录时,您可以filter此列表,并查看此列表中是否包含指定username的用户。例子:


String usernameOfUserTryingToLogIn = "John".toLowerCase();
Optional<String> foundUserOptional = listWithUsers.stream().filter(userData -> userData.getUsername().equals(usernameOfUserTryingToLogIn)).findFirst();
if(foundUserOptional.isPresent())
{
// User is found, do what you need to do with his password
UserData foundUser = foundUserOptional.get();
}
else
{
// User not found, means he is not registered or whatever you want to do ...
}

还有一个建议,不要每次用户尝试登录时都读取文件,只在第一次启动程序时读取文件,并将数据保存在如上所述的列表中。这当然是在文件没有外部更改的情况下。

最新更新