将具有重复键的JSON对象转换为JSON数组
我有一个JSON字符串,我从包含重复键的数据库中获得。 我想通过将它们的值组合到一个数组中来移除重复的键。
例如
输入
{
"a":"b",
"c":"d",
"c":"e",
"f":"g"
}
产量
{
"a":"b",
"c":["d","e"],
"f":"g"
}
实际的数据是一个可能嵌套的大文件。 我不会提前知道什么或有多少对。
我需要为此使用Java。 org.json抛出一个异常,因为重复键,gson可以解析字符串,但每个重复的键都会覆盖最后一个键。 我需要保留所有的数据。
如果可能的话,我想在不编辑任何库代码的情况下执行此操作
截至今天, org.json
库版本20170516
提供了accumulate()
方法,该方法将重复的键条目存储到JSONArray
JSONObject jsonObject = new JSONObject();
jsonObject.accumulate("a", "b");
jsonObject.accumulate("c", "d");
jsonObject.accumulate("c", "e");
jsonObject.accumulate("f", "g");
System.out.println(jsonObject);
输出:
{
“一”: “B”,
“C”:[ “d”, “E”],
“F”: “克”
}
我想通过将它们的值组合到一个数组中来移除重复的键。
除了JSON解析库以外,请考虑一下。 这是非常简单的Java程序,它使用String.split()
方法将Json字符串转换为Map<String, List<String>>
而不使用任何库 。
示例代码:
String jsonString = ...
// remove enclosing braces and double quotes
jsonString = jsonString.substring(2, jsonString.length() - 2);
Map<String, List<String>> map = new HashMap<String, List<String>>();
for (String values : jsonString.split("","")) {
String[] keyValue = values.split("":"");
String key = keyValue[0];
String value = keyValue[1];
if (!map.containsKey(key)) {
map.put(key, new ArrayList<String>());
}
map.get(key).add(value);
}
输出:
{
"f": ["g"],
"c": ["d","e"],
"a": ["b"]
}
为了实现你想要的,你需要创建一些自定义类,因为JSON
在技术上不可能在一个键上有2个值。 下面是一个例子:
public class SomeClass {
Map<String, List<Object>> values = new HashMap<String, List<Object>>();
public void add(String key, Object o) {
List<Object> value = new ArrayList<Object>();
if (values.containsKey(key)) {
value = values.get(key);
}
value.add(o);
values.put(key, value);
}
public JSONObject toJson() throws JSONException {
JSONObject json = new JSONObject();
JSONArray tempArray = null;
for (Entry<String, List<Object>> en : values.entrySet()) {
tempArray = new JSONArray();
for (Object o : en.getValue()) {
tempArray.add(o);
}
json.put(en.getKey(), tempArray);
}
return json;
}
}
然后,您可以从数据库中检索值,使用数据库中的列名称和值(作为Object
参数)调用.add(String key, Object o)
函数。 然后在完成时调用.toJson()
。
上一篇: Convert JSON object with duplicate keys to JSON array
下一篇: Need Example of passing Jasper Reports Parameters for REST v2 API using JSON