检查JSONobject的值时如何停止ConcurrentModificationException

2345678:

我正在从数据库中读取数据,然后将数据放入JSON对象,该对象还包含一个内部json对象。数据库中的某些数据以“”形式返回,我想删除该对象的键和值。

数据是这样来的:

 { 
  "foo": "bar",
   "bar": "",
   "foo": {
         "bar": "foo",
    },
    "bar": "foo"
    },

我希望数据看起来像这样:

 { 
  "foo": "bar",
   "foo": {
         "bar": "foo",
    },
    "bar": "foo"
    },

我尝试使用以下代码

  private JSONObject removeEmpty(JSONObject root) {
    root.keys().forEachRemaining(key -> {
        Object value = root.get(key);
        if (value instanceof JSONObject) {
            removeEmpty((JSONObject) value);
        } else if(value.equals("")) {
            root.remove(key);
        }
    });
    return root;
}

但是我正在抛出java.util.ConcurrentModificationException错误,并且我不确定如何在json对象中解决此问题。有谁对解决这个问题有任何建议吗?

堆栈轨迹是

java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextNode(HashMap.java:1442)
at java.util.HashMap$KeyIterator.next(HashMap.java:1466)
at java.util.Iterator.forEachRemaining(Iterator.java:116)
at database.ConvertToJSON.removeEmpty(ConvertToJSON.java:48)
at database.ConvertToJSON.convertToJSON(ConvertToJSON.java:40)
at database.Database.searchByLocation(Database.java:24)
at Application$1.handle(Application.java:30)
at spark.RouteImpl$1.handle(RouteImpl.java:72)
at spark.http.matching.Routes.execute(Routes.java:61)
at spark.http.matching.MatcherFilter.doFilter(MatcherFilter.java:130)
at spark.embeddedserver.jetty.JettyHandler.doHandle(JettyHandler.java:50)
at com.spark.shaded.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1568)
at com.spark.shaded.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at com.spark.shaded.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
at com.spark.shaded.eclipse.jetty.server.Server.handle(Server.java:530)
at com.spark.shaded.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:347)
at com.spark.shaded.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:256)
at com.spark.shaded.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:279)
at com.spark.shaded.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:102)
at com.spark.shaded.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:124)
at com.spark.shaded.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:247)
at com.spark.shaded.eclipse.jetty.util.thread.strategy.EatWhatYouKill.produce(EatWhatYouKill.java:140)
at com.spark.shaded.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:708)
at com.spark.shaded.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:626)
at java.lang.Thread.run(Thread.java:748)
TheChubbyPanda:

您无法像在清单中所做的那样在对象上进行迭代时从对象中删除项目forEachRemaining您既可以标记要删除的项目(如下所示),也可以创建副本以迭代并从原始对象中删除。

private JSONObject removeEmpty(JSONObject root) {
    ArrayList<Object> toRemove = new ArrayList<>();
    root.keys().forEachRemaining(key -> {
        Object value = root.get(key);
        if (value instanceof JSONObject) {
            removeEmpty((JSONObject) value);
        } else if(value.equals("")) {
            toRemove.add(key)
        }
    });

    foreach (Object o : toRemove) {
        root.remove((String)o);
    }

    return root;
}

如果您遇到相同的错误但关于值,则需要对值执行相同的操作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章