为何JSON中生成的蜜罐密码为长数字?求转换及验证方法
解决JSON中出现超长数字串且蜜罐词不显示的问题
看起来你遇到的问题是:生成的随机字母蜜罐词没有正确出现在JSON文件中,反而看到一堆超长数字串,而且不确定蜜罐词是否生成成功。我来帮你分析一下原因并给出解决方案:
问题根源分析
- 现有JSON文件的遗留内容:你展示的JSON里的超长数字串是原来
honeyWord.json文件里就有的内容,不是你当前代码生成的。你的代码逻辑是读取现有JSON的内容,然后把蜜罐词作为顶级键添加到Map中,再写回文件,所以这些原有内容不会被覆盖,依然会保留在JSON里。 - 代码逻辑与预期不符:从代码看,你把生成的蜜罐词作为Map的key,值设为空字符串。但如果你的预期是把蜜罐词作为某个字段的值(比如
password字段下的数组或列表),那当前代码的逻辑就错了,导致你找不到生成的蜜罐词。 - 蜜罐词生成逻辑是正常的:你的随机字母串生成逻辑没问题,
honeyWordSet里应该已经有100个符合要求的蜜罐词了,只是因为你把它们作为顶级键添加到现有Map,而现有JSON里的password和index字段太显眼,你没注意到这些新增的键。
解决方案
方案1:替换原有JSON内容,只存储蜜罐词
如果你想完全替换原有JSON的内容,只保存生成的蜜罐词,可以修改代码如下:
public static String characters[] = {"a","s","d","f","g","h","j","k","l","q","w","e","r","t","y","u","i","o","p","z","x","c","v","b","n","m"}; static Set<String> honeyWordSet = new HashSet<String>(); public static void generateHoneywords() { Random rn = new Random(); while(honeyWordSet.size() < 101) { StringBuffer word = new StringBuffer(); int numOfChar; do { numOfChar = rn.nextInt(10); } while(numOfChar < 1); for(int j=0; j<numOfChar; j++) { word.append(characters[rn.nextInt(characters.length)]); } honeyWordSet.add(word.toString()); } try { ObjectMapper mapper = new ObjectMapper(); // 创建新的Map,不读取原有文件内容 Map<String, Object> map = new HashMap<>(); // 将蜜罐词以数组形式存入指定字段 map.put("honeywords", new ArrayList<>(honeyWordSet)); mapper.writeValue(new File("jsonFiles\\honeyWord.json"), map); System.out.println("蜜罐词生成并写入成功!"); } catch(Exception e) { e.printStackTrace(); } }
方案2:保留原有JSON内容,追加蜜罐词
如果你需要保留原有JSON里的password和index字段,同时把蜜罐词添加到新字段下:
public static String characters[] = {"a","s","d","f","g","h","j","k","l","q","w","e","r","t","y","u","i","o","p","z","x","c","v","b","n","m"}; static Set<String> honeyWordSet = new HashSet<String>(); public static void generateHoneywords() { Random rn = new Random(); while(honeyWordSet.size() < 101) { StringBuffer word = new StringBuffer(); int numOfChar; do { numOfChar = rn.nextInt(10); } while(numOfChar < 1); for(int j=0; j<numOfChar; j++) { word.append(characters[rn.nextInt(characters.length)]); } honeyWordSet.add(word.toString()); } try { ObjectMapper mapper = new ObjectMapper(); File jsonFile = new File("jsonFiles\\honeyWord.json"); Map<String, Object> map; // 文件不存在则创建新Map,否则读取现有内容 if (!jsonFile.exists()) { map = new HashMap<>(); } else { map = mapper.readValue(jsonFile, new TypeReference<Map<String, Object>>() {}); } // 将蜜罐词添加到新字段中 map.put("honeywords", new ArrayList<>(honeyWordSet)); mapper.writeValue(jsonFile, map); System.out.println("蜜罐词生成并追加到JSON成功!"); } catch(Exception e) { e.printStackTrace(); } }
清除原有超长数字串
如果你想删除原有JSON里的超长数字串(即password字段),可以在读取Map后添加一行:
map.remove("password");
验证蜜罐词生成状态
你可以在生成完honeyWordSet后,添加一段代码打印部分蜜罐词,确认生成是否正常:
// 打印前10个蜜罐词验证 System.out.println("生成的蜜罐词示例:"); int count = 0; for(String word : honeyWordSet) { System.out.println(word); if(++count == 10) break; }
内容的提问来源于stack exchange,提问作者nuradilla
相关产品推荐
相关产品推荐

