新的可变JsonNode类型既没有Clone()也没有复制构造函数。我怎样才能复印一份?
我试图使用JsonObject复制一个浅表new JsonObject(original) (一个填充了原始键值对的),但即使这样也不起作用(它抛出InvalidOperationException,因为JsonNode不能在两个JSON树之间共享)。
发布于 2022-02-05 17:04:44
通过将其转换为JSON并将其转换回JsonNode,您可以间接地克隆它。
快速而肮脏的方式:
var copy = JsonNode.Parse(original.ToJsonString());应该注意的是,JsonNode以UTF-8格式读写JSON,因此该方法效率低下,部分原因是它将转换为UTF-16并返回(部分原因是它正在解析,我们似乎无法避免)。下面是一种更有效的方法:
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使用的数组池优化,它依赖于我们无法访问的内部类。还是更好。)
单元测试:
[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);
}发布于 2022-08-04 09:14:03
注意:我的解决方案是用JAVA编写的
我在迭代期间复制了我的"valueNode“,并使用ObjectMapper复制了它,现在"copyJsonNode”是"valueNode“的副本,我需要进一步实现。
if (entry.getKey().equalsIgnoreCase("admin")) {
JsonNode valueNode = entry.getValue();
String copyjson = valueNode.toString();
ObjectMapper objectMapper = new ObjectMapper();
JsonNode copyJsonNode = objectMapper.readTree(copyjson);
....}https://stackoverflow.com/questions/71000221
复制相似问题