首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何复制JsonNode / JsonObject / JsonArray?

如何复制JsonNode / JsonObject / JsonArray?
EN

Stack Overflow用户
提问于 2022-02-05 17:04:44
回答 2查看 421关注 0票数 0

新的可变JsonNode类型既没有Clone()也没有复制构造函数。我怎样才能复印一份?

我试图使用JsonObject复制一个浅表new JsonObject(original) (一个填充了原始键值对的),但即使这样也不起作用(它抛出InvalidOperationException,因为JsonNode不能在两个JSON树之间共享)。

EN

回答 2

Stack Overflow用户

发布于 2022-02-05 17:04:44

通过将其转换为JSON并将其转换回JsonNode,您可以间接地克隆它。

快速而肮脏的方式:

代码语言:javascript
复制
var copy = JsonNode.Parse(original.ToJsonString());

应该注意的是,JsonNode以UTF-8格式读写JSON,因此该方法效率低下,部分原因是它将转换为UTF-16并返回(部分原因是它正在解析,我们似乎无法避免)。下面是一种更有效的方法:

代码语言:javascript
复制
public static JsonNode? Clone(this JsonNode? node) {
    if (node == null)
        return null;

    // Yes, we're creating three garbage objects (array + two writers) but
    // the alternative `JsonNode.Parse(original.ToJsonString())` is worse.
    var buf = new ArrayBufferWriter<byte>(512);
    var jwriter = new Utf8JsonWriter(buf);
    node.WriteTo(jwriter);
    jwriter.Flush(); // I don't know why this is necessary, but it is
    return JsonNode.Parse(buf.WrittenSpan);
}

[return: NotNullIfNotNull("node")]
public static JsonObject? Clone(this JsonObject? node)
    => (JsonObject?) Clone((JsonNode) node);

[return: NotNullIfNotNull("node")]
public static JsonArray? Clone(this JsonArray? node)
    => (JsonArray?) Clone((JsonNode)node);

(这确实缺乏ToJsonString使用的数组池优化,它依赖于我们无法访问的内部类。还是更好。)

单元测试:

代码语言:javascript
复制
[Test]
public void JsonNodeCloneTest()
{
    var json = JsonNode.Parse(@"{
        ""A"": 12345.67890,
        ""B"": [ ""string"", false, true, null, { ""N"": ""no"" } ]
    }")!;
    var jsonString1 = json.ToJsonString();
            
    var json2 = json.Clone(); // method under test
            
    var jsonString2 = json2.ToJsonString();

    Assert.AreEqual(jsonString1, jsonString2);
}
票数 1
EN

Stack Overflow用户

发布于 2022-08-04 09:14:03

注意:我的解决方案是用JAVA编写的

我在迭代期间复制了我的"valueNode“,并使用ObjectMapper复制了它,现在"copyJsonNode”是"valueNode“的副本,我需要进一步实现。

代码语言:javascript
复制
if (entry.getKey().equalsIgnoreCase("admin")) {

            JsonNode valueNode = entry.getValue();
            
            String copyjson = valueNode.toString();

            ObjectMapper objectMapper = new ObjectMapper();

            JsonNode copyJsonNode = objectMapper.readTree(copyjson);

           ....}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71000221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档