【问题标题】:How to get the key of the vale in json simple in java如何在java中简单地获取json中vale的密钥
【发布时间】:2021-09-04 15:29:55
【问题描述】:

我遇到了问题

{
"a": "X1abs",
"b": "d4vT"

}

这是通过插件 json-simple 来完成的

所以我想要的是,如果我有"X1abs",那么我得到的密钥是"a" 请帮帮我

【问题讨论】:

  • 向我们展示您尝试过的代码,并解释什么没有按预期工作。
  • 您很可能需要遍历对象中的所有值才能找到它。

标签: java json-simple


【解决方案1】:

以下代码将 JSON 转换为地图

public static Map<String, Object> jsonToMap(JSONObject json) throws JSONException {
    Map<String, Object> retMap = new HashMap<String, Object>();
    
    if(json != JSONObject.NULL) {
        retMap = toMap(json);
    }
    return retMap;
}

public static Map<String, Object> toMap(JSONObject object) throws JSONException {
    Map<String, Object> map = new HashMap<String, Object>();

    Iterator<String> keysItr = object.keys();
    while(keysItr.hasNext()) {
        String key = keysItr.next();
        Object value = object.get(key);
        
        if(value instanceof JSONArray) {
            value = toList((JSONArray) value);
        }
        
        else if(value instanceof JSONObject) {
            value = toMap((JSONObject) value);
        }
        map.put(key, value);
    }
    return map;
}

public static List<Object> toList(JSONArray array) throws JSONException {
    List<Object> list = new ArrayList<Object>();
    for(int i = 0; i < array.length(); i++) {
        Object value = array.get(i);
        if(value instanceof JSONArray) {
            value = toList((JSONArray) value);
        }

        else if(value instanceof JSONObject) {
            value = toMap((JSONObject) value);
        }
        list.add(value);
    }
    return list;
}

以下代码根据值识别键:

for (Entry<Integer, String> entry : testMap.entrySet()) {
            if (entry.getValue().equals("c")) {
                System.out.println(entry.getKey());
            }
        }

【讨论】:

    【解决方案2】:

    如果像“X1abs”这样的值是唯一的,那么你可以创建一个反向映射来存储值作为键,键作为值。像这样的例子:

    创建一个HashMap:

    Map<String, String> reverseMap = new HashMap<>();
    

    然后,对于每个对象 key : value,你这样做:

    reverseMap.put(value, key);
    

    完成映射后,您可以检索带有值的键,如下所示:

    String key = reverseMap.get(“X1abs”); // the key should be “a”
    

    但是,如果值不是唯一的,则键上没有唯一解。您需要每个值的键列表,映射应该是这样的:

    Map<String, List<String>> reverseMap = new HashMap<>();
    

    然后,对每个对象(值、键)执行以下操作:

    reverseMap.computeIfAbsent(value, x -> new ArrayList<>()).add(key);
    

    映射完成后,您可以为每个值检索一个键列表:

    List<String> list = reverseMap.get(“X1abs”);
    

    然后您可以迭代列表以获得您想要的任何值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-10
      • 2015-05-27
      • 2018-01-16
      • 1970-01-01
      • 1970-01-01
      • 2021-07-26
      相关资源
      最近更新 更多