如何在搜索JSON对象时忽略大小写

时间:2013-08-05 20:11:22

标签: java json json-simple

我的示例JSON输入如下:

"JobName":"Test Job 1",
"events":[
    {   "features":[],
        "InputHiveTable":"uilog_uiclientlogdata",
        "eventColumn":"command",
        "name":"edu.apollogrp.classroom.discussion.client.events.CreateDiscussionEvent"
    },

考虑字段"InputHiveTable",它可以全部为大写INPUTHIVETABLE,全部为小写inputhivetable,也可以是两者的混合。

目前,我正在阅读以下字段(在Java中):

JSONObject jsonObject = (JSONObject) obj;
JSONArray events = (JSONArray) jsonObject.get("events");
String InputHiveTable = (String)event.get("InputHiveTable");

所以我的问题是如何在忽略案例时搜索字段"InputHiveTable"。 我正在使用JSON Simple库。

3 个答案:

答案 0 :(得分:16)

如果你不得不多次执行这种不区分大小写的查找,我只想写一个方法来进行查找:

public Object getIgnoreCase(JSONObject jobj, String key) {

    Iterator<String> iter = jobj.keySet().iterator();
    while (iter.hasNext()) {
        String key1 = iter.next();
        if (key1.equalsIgnoreCase(key)) {
            return jobj.get(key1);
        }
    }

    return null;

}

答案 1 :(得分:1)

鉴于可以使用TreeMap(即通过String.CASE_INSENSITIVE_ORDER比较器)实现不区分大小写,您可以执行以下操作:

  1. 实施您自己的MyJSONObject扩展TreeMap,其方法只是调用JSONObject的静态方法,使用与JSONObject中相同的签名和所有必需的接口。在默认构造函数中写入super(String.CASE_INSENSITIVE_ORDER)

  2. 实施ContainerFactory界面createObjectContainer将返回MyJSONObject的新实例(而createArrayContainer将返回新的JSONArray)。

  3. 使用新容器MyContainerFactory

    运行它
     StringReader in = new StringReader(yourJSONString);                    
     JSONParser parser = new JSONParser();      
     parser.parse(in, yourContainerFactory)
    

答案 2 :(得分:0)

您可以将JSONObject读入java字符串,并在其上调用String.toLowerCase并将其存储回JSONObject。这会将字符串的整个大小写变为小写,因此您必须考虑逻辑中其他位置的情况。之后,您只需要在“inputhivetable”上进行调用。

绝不是一个漂亮的解决方案,但如果绝对没有办法处理你作为JSON输入返回的内容,这是一个潜在的解决方法。