我的示例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库。
答案 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
比较器)实现不区分大小写,您可以执行以下操作:
实施您自己的MyJSONObject
扩展TreeMap
,其方法只是调用JSONObject
的静态方法,使用与JSONObject
中相同的签名和所有必需的接口。在默认构造函数中写入super(String.CASE_INSENSITIVE_ORDER)
实施ContainerFactory
界面createObjectContainer
将返回MyJSONObject
的新实例(而createArrayContainer
将返回新的JSONArray
)。
使用新容器MyContainerFactory
:
StringReader in = new StringReader(yourJSONString);
JSONParser parser = new JSONParser();
parser.parse(in, yourContainerFactory)
答案 2 :(得分:0)
您可以将JSONObject读入java字符串,并在其上调用String.toLowerCase并将其存储回JSONObject。这会将字符串的整个大小写变为小写,因此您必须考虑逻辑中其他位置的情况。之后,您只需要在“inputhivetable”上进行调用。
绝不是一个漂亮的解决方案,但如果绝对没有办法处理你作为JSON输入返回的内容,这是一个潜在的解决方法。