Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何修改JSON数据并返回更新后的JSON数据_Java_Json - Fatal编程技术网

Java 如何修改JSON数据并返回更新后的JSON数据

Java 如何修改JSON数据并返回更新后的JSON数据,java,json,Java,Json,我们需要在中间更新JSON数据,并且需要使用java返回更新后的JSON数据。它还应该支持任何类型的JSON数据 例: 假设{object:{“color”:“red”,“shape”:“Triangle”}}是JSON数据,我们需要将shape值更新为Rectangle,我们需要返回更新后的JSON数据,如下所示: {object:{"color":"red","shape":"Rectangle"}} 为此,我们需要将元素路径(需要更新的元素)和updateText和JSON数据传递给JA

我们需要在中间更新JSON数据,并且需要使用java返回更新后的JSON数据。它还应该支持任何类型的JSON数据

例: 假设
{object:{“color”:“red”,“shape”:“Triangle”}}
是JSON数据,我们需要将
shape
值更新为
Rectangle
,我们需要返回更新后的JSON数据,如下所示:

{object:{"color":"red","shape":"Rectangle"}}
为此,我们需要将元素路径(需要更新的元素)和updateText和JSON数据传递给JAVA代码

以下是methodCall:

updateValue("object/shape", "Rectangle", "{object:{"color":"red","shape":"Triangle"}}")
我们使用Gson库尝试了以下代码。但是,通过这段代码,我们可以更新目标Json元素,但需要使用更新后的值返回整个Json数据

因此,请建议我们如何用更新后的文本重新构建JSON数据

下面是我们试图更新Json数据的代码

    public String updateValue(String keyPath, String updateText, String jsonText) {
    String[] keys = keyPath.split("/");
    JsonParser jsonParser = new JsonParser();
    JsonObject jsonObject = (JsonObject) jsonParser.parse(jsonText);
    String result = "";
    for(String key : keys)
    {
        if (jsonObject.get(key) instanceof JsonObject)
        {
          jsonObject = (JsonObject)jsonObject.get(key);
        }
        else if(jsonObject.get(key) instanceof JsonArray)
        {
          JsonArray jsonArray = (JsonArray)jsonObject.get(key);
          result = jsonArray.toString();
        }
        else 
        {
          result = jsonObject.get(key).toString();
        }           
    }
    result = result.replace(result, updateText);
    return result;      
}

问题在于你替换的方式。当您将JsonObject转换为字符串时,您将丢失该对象,并且在替换之后,您只拥有被替换的字符串。要修复它,您需要直接对对象进行操作,而不是对字符串对应项进行操作。因为JsonObject是可变的,所以保存对输入的引用将反映更改。一个缺点是不能用这种方式替换JsonArray中的值,部分原因是您不知道要替换哪个元素。要实现这一点,您需要在输入中多输入一点(要替换的值或元素位置)

您可以使用,然后尝试使用以下代码

private static final Configuration configuration = Configuration.builder()
     .jsonProvider(new JacksonJsonNodeJsonProvider())
     .mappingProvider(new JacksonMappingProvider())
     .build();

JsonNode updatedJson = JsonPath.using(configuration).parse(originaljson)
     .set("use the path to go for value", "new value").json();
json = updatedJson.toString();

你好,普拉迪普,谢谢你的回复。在这段代码中,returnVal引用变量jsonObject,该变量在for循环内部进行修改。最后,它返回最内部的JSONObject,其中包含JSON值JSONArray或value。例如:在这个例子中,这个代码返回
{“color”:“red”,“shape”:“Triangle”}
并省略
{“Object”}
它应该返回:
{Object:{“color”:“red”,“shape”:“Rectangle”}
(它应该用修改过的val重新构建整个JSON对象)
private static final Configuration configuration = Configuration.builder()
     .jsonProvider(new JacksonJsonNodeJsonProvider())
     .mappingProvider(new JacksonMappingProvider())
     .build();

JsonNode updatedJson = JsonPath.using(configuration).parse(originaljson)
     .set("use the path to go for value", "new value").json();
json = updatedJson.toString();