我有一个重复值的Json字符串:
String json = "{\"Sign_In_Type\":\"Action\",\"Sign_In_Type\":\"Action\"}";
在我尝试创建JSONObject时正确抛出异常:
try { JSONObject json_obj = new JSONObject(json); String type = json_obj.getString("Sign_In_Type"); } catch (JSONException e) { throw new RuntimeException(e); }
错误:
Exception in thread "main" java.lang.RuntimeException: org.json.JSONException: Duplicate key "Sign_In_Type" at com.campanja.app.Upload.main(Upload.java:52) Caused by: org.json.JSONException: Duplicate key "Sign_In_Type" at org.json.JSONObject.putOnce(JSONObject.java:1076) at org.json.JSONObject.(JSONObject.java:205) at org.json.JSONObject.(JSONObject.java:402) at com.campanja.app.Upload.main(Upload.java:49)
在将其转换为JSONOBject之前,是否有一种智能方法可以删除或检查重复项?
我试图创建:
Set set = new HashSet(Arrays.asList(json));
但这给了我:
[{"Sign_In_Type":"Action","Sign_In_Type":"Action"}]
欢迎任何建议,谢谢!
解决方法
我可以想到两个选项:
>使用wither regex或tokens解析字符串,将每个键值对添加到hashmap,最后重新创建删除了重复项的JSON文档.在这种情况下,虽然我只会删除完全相同的键值对.
>下载org.json.JSONObject的源代码,并对代码稍作修改,以自动省去重复项.这有点危险.另一种选择是创建一个简单验证和修改的修改版本.
扩展JSONObject工作示例
下面的代码允许您使用包含重复键的字符串创建JSONOBbject.仅当您有两个具有相同键但值不同的键值时,才会抛出异常.这是因为我认为随机选择应该分配哪两个(例如后面的值?)是个问题.当然,这可以根据需要更改为工作(例如,保留多个键的最后一个值).
修改后的类
import org.json.JSONException; import org.json.JSONObject; public class JSONObjectIgnoreDuplicates extends JSONObject { public JSONObjectIgnoreDuplicates(String json) { super(json); } public JSONObject putOnce(String key,Object value) throws JSONException { Object storedValue; if (key != null && value != null) { if ((storedValue = this.opt(key)) != null ) { if(!storedValue.equals(value)) //Only through Exception for different values with same key throw new JSONException("Duplicate key \"" + key + "\""); else return this; } this.put(key,value); } return this; } }
主要方法
String json = "{\"Sign_In_Type\":\"Action\",\"Sign_In_Type\":\"Action\"}"; try { JSONObject json_obj = new JSONObjectIgnoreDuplicates(json); String type = json_obj.getString("Sign_In_Type"); } catch (JSONException e) { throw new RuntimeException(e); }