将具有重复键的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()

链接地址: http://www.djcxy.com/p/37835.html

上一篇: Convert JSON object with duplicate keys to JSON array

下一篇: Need Example of passing Jasper Reports Parameters for REST v2 API using JSON