将 JSON 字符串中的特定节点读取为原始 JSON

本文关键字:JSON 节点 读取 原始 字符串 | 更新日期: 2023-09-27 18:35:18

假设我有一个模型:

public class Node<T> {
    public T Value { get; set; }
}

我序列化一个int[]节点,结果是:

{"value":[1,2,3]}

我现在想将其反序列化为: 因此Node<string>将其视为 JSON 块:

node.Value == "[1,2,3]"

我现在可以使用自定义JsonConverter,例如使用JToken.ReadFrom,然后对其进行ToString。但是,这会使格式等中断。

我还可以创建一个新JsonWriter并在我的Converter中像这样使用它:

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
    var sb = new StringBuilder();
    using (var wo = new StringWriter(sb))
    {
        using (var w = new JsonTextWriter(wo))
        {
            w.WriteToken(reader, true);
        }    
    }
    return sb.ToString();
}

我使用此解决方案的问题是它将为每个标有转换器的属性创建编写器......

第三种解决方案是自己遍历图形并重用编写器等。

将 JSON 字符串中的某些节点反序列化为原始 JSON 的推荐(最有效)解决方案是什么?请注意,JSON 结果中将包含许多项目,因此不会只有一个对象具有此节点。

将 JSON 字符串中的特定节点读取为原始 JSON

Json.NET 将 JSON 解析为令牌(对象开始、属性、字符串等),然后序列化程序读取这些标记以构造对象。无法捕获原始传入文本并准确保留格式。

壁橱功能是具有一个 JToken 属性,该属性最终将得到一个表示原始 JSON 的对象。然后,您可以在其上调用ToString(),但确切的格式将丢失。

如果要以特定方式编写 JSON,则 JRaw 属性的内容将完全按照提供的方式写入。

序列化原始 JSON