验证 Redis(Jedis) 的键值是否为 JSON
Verifying if Key Values of Redis(Jedis) are JSON
我正在尝试制作一个 Java 程序来遍历 Redis 数据库,验证键值;如果它是有效的 JSON,则将其提取到一个单独的模式中(尚未对此做任何处理);否则,什么也不做,继续搜索其他键。
这是我的函数代码:
Jedis jedis = new Jedis("localhost");
ScanResult<String> scanResult = jedis.scan("0");
List<String> keys = scanResult.getResult();
String nextCursor = scanResult.getStringCursor();
JSONParser parser = new JSONParser();
int counter = 0;
while(true) {
if(nextCursor.equals("0")) {
break;
}
scanResult = jedis.scan(nextCursor);
nextCursor = scanResult.getStringCursor();
keys = scanResult.getResult();
for(counter = 0; counter <= keys.size(); counter++) {
try {
JSONObject json = (JSONObject) parser.parse(keys.get(counter).toString());
} catch (ParseException e) {
e.printStackTrace();
}
}
System.out.println(keys = scanResult.getResult());
}
jedis.close();
我在使用 JSON Parse 时遇到了麻烦(idk 如果我正确使用他的话)因为我认为我只得到了 KEY NAMES(而不是它们的值)。
我尝试使用 Map<String, String> = scanResult.getResult()
而不是 List<String>
,但它指出了类型不匹配问题。
看起来很容易解决,但我有点卡在这一点上......欢迎任何可以提供帮助的提示,谢谢。
P.S.: 我不能使用像 ReJSON 这样的模块,必须使用原生的 redis 函数。
我想我明白了。回答我自己的问题:
public void readRedis() {
Jedis jedis = new Jedis("localhost");
ScanResult<String> scanResult = jedis.scan("0");
String nextCursor = scanResult.getStringCursor();
JSONParser parser = new JSONParser();
int counter = 0;
while (true) {
nextCursor = scanResult.getStringCursor();
List<String> keys = scanResult.getResult();
for (counter = 0; counter < keys.size(); counter++) {
if(counter == keys.size()) {
break;
}
try {
JSONObject json = (JSONObject) parser.parse(jedis.rpop(keys.get(counter)));
documentoJson(json);
System.out.println("Added to function 'documentoJson'");
} catch (ParseException e) {
System.out.println("Not a valid JSON");
}
}
if (nextCursor.equals("0")) {
break;
}
scanResult = jedis.scan(nextCursor);
}
jedis.close();
}
public JSONArray documentoJson(JSONObject json) {
JSONObject jObject = new JSONObject();
JSONArray jArray = new JSONArray();
jArray.add(json);
jObject.put("JSON Document", jArray);
return jArray;
}
我正在尝试制作一个 Java 程序来遍历 Redis 数据库,验证键值;如果它是有效的 JSON,则将其提取到一个单独的模式中(尚未对此做任何处理);否则,什么也不做,继续搜索其他键。
这是我的函数代码:
Jedis jedis = new Jedis("localhost");
ScanResult<String> scanResult = jedis.scan("0");
List<String> keys = scanResult.getResult();
String nextCursor = scanResult.getStringCursor();
JSONParser parser = new JSONParser();
int counter = 0;
while(true) {
if(nextCursor.equals("0")) {
break;
}
scanResult = jedis.scan(nextCursor);
nextCursor = scanResult.getStringCursor();
keys = scanResult.getResult();
for(counter = 0; counter <= keys.size(); counter++) {
try {
JSONObject json = (JSONObject) parser.parse(keys.get(counter).toString());
} catch (ParseException e) {
e.printStackTrace();
}
}
System.out.println(keys = scanResult.getResult());
}
jedis.close();
我在使用 JSON Parse 时遇到了麻烦(idk 如果我正确使用他的话)因为我认为我只得到了 KEY NAMES(而不是它们的值)。
我尝试使用 Map<String, String> = scanResult.getResult()
而不是 List<String>
,但它指出了类型不匹配问题。
看起来很容易解决,但我有点卡在这一点上......欢迎任何可以提供帮助的提示,谢谢。
P.S.: 我不能使用像 ReJSON 这样的模块,必须使用原生的 redis 函数。
我想我明白了。回答我自己的问题:
public void readRedis() {
Jedis jedis = new Jedis("localhost");
ScanResult<String> scanResult = jedis.scan("0");
String nextCursor = scanResult.getStringCursor();
JSONParser parser = new JSONParser();
int counter = 0;
while (true) {
nextCursor = scanResult.getStringCursor();
List<String> keys = scanResult.getResult();
for (counter = 0; counter < keys.size(); counter++) {
if(counter == keys.size()) {
break;
}
try {
JSONObject json = (JSONObject) parser.parse(jedis.rpop(keys.get(counter)));
documentoJson(json);
System.out.println("Added to function 'documentoJson'");
} catch (ParseException e) {
System.out.println("Not a valid JSON");
}
}
if (nextCursor.equals("0")) {
break;
}
scanResult = jedis.scan(nextCursor);
}
jedis.close();
}
public JSONArray documentoJson(JSONObject json) {
JSONObject jObject = new JSONObject();
JSONArray jArray = new JSONArray();
jArray.add(json);
jObject.put("JSON Document", jArray);
return jArray;
}