【问题标题】:How to ignore case when searching a JSON Object搜索 JSON 对象时如何忽略大小写
【发布时间】:2013-08-05 20:11:22
【问题描述】:

我的 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 简单库。

【问题讨论】:

    标签: java json json-simple


    【解决方案1】:

    如果您必须多次执行这种不区分大小写的查找,我只需编写一个方法来执行该查找:

    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;
    
    }
    

    【讨论】:

      【解决方案2】:

      鉴于可以使用 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)
        

      【讨论】:

        【解决方案3】:

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

        这绝不是一个漂亮的解决方案,但如果您绝对没有其他方法可以处理您作为 JSON 输入返回的内容,那么它是一种潜在的解决方法。

        【讨论】:

        • 这将具有小写值以及键的明显缺点。似乎没有简单的方法可以单独对键进行不区分大小写的匹配,而不需要更花哨的方法,例如迭代键或更改解析器。
        • 在值的格式不重要时执行此工作。就我而言,我所有的价值观都是数字。
        • 这是我使用的解决方案,因为在我的情况下,值也不区分大小写。
        猜你喜欢
        • 2013-04-11
        • 1970-01-01
        • 2017-02-25
        • 1970-01-01
        • 2022-11-25
        • 1970-01-01
        • 2013-08-18
        • 1970-01-01
        • 2017-01-01
        相关资源
        最近更新 更多