8

我的示例 JSON 输入如下:

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

考虑 field "InputHiveTable",它可能是全部大写INPUTHIVETABLE,全部小写inputhivetable,或者两者的混合,就像现在一样。

目前,我正在阅读以下领域(在 Java 中):

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

所以我的问题是如何"InputHiveTable"在忽略大小写的情况下搜索该字段。我正在使用 JSON 简单库。

4

3 回答 3

19

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

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;

}
于 2013-08-05T22:46:07.380 回答
2

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

  1. 实现您自己的MyJSONObject扩展TreeMap,其方法将仅调用JSONObject具有相同签名和所有必需接口的静态方法,如JSONObject. 在默认构造函数中写super(String.CASE_INSENSITIVE_ORDER)

  2. 实现ContainerFactory接口 wherecreateObjectContainer将返回新的实例MyJSONObject(并且createArrayContainer只会返回 new JSONArray)。

  3. 使用新容器运行它MyContainerFactory

     StringReader in = new StringReader(yourJSONString);                    
     JSONParser parser = new JSONParser();      
     parser.parse(in, yourContainerFactory)
    
于 2013-08-05T21:27:58.563 回答
1

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

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

于 2013-08-05T20:33:18.147 回答