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

C# 将JSON字符串中的特定节点读取为原始JSON,c#,json.net,C#,Json.net,假设我有一个模型: public class Node<T> { public T Value { get; set; } } 现在我想将其反序列化为:节点,因此将其视为JSON块: node.Value == "[1,2,3]" 我现在可以使用自定义的JsonConverter,例如使用JToken.ReadFrom,然后对其执行ToString。但是,这会使格式设置等中断 我还可以创建一个新的JsonWriter,并在我的转换器中这样使用它: public overr

假设我有一个模型:

public class Node<T> {
    public T Value { get; set; }
}
现在我想将其反序列化为:
节点
,因此将其视为JSON块:

node.Value == "[1,2,3]"
我现在可以使用自定义的
JsonConverter
,例如使用
JToken.ReadFrom
,然后对其执行
ToString
。但是,这会使格式设置等中断

我还可以创建一个新的
JsonWriter
,并在我的
转换器中这样使用它:

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

它的closes功能具有一个JToken属性,该属性将以一个表示原始JSON的对象结束。然后可以对其调用ToString(),但确切的格式将丢失

如果您想以特定的方式编写JSON,那么JRaw属性的内容将完全按照提供的方式编写


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

它的closes功能具有一个JToken属性,该属性将以一个表示原始JSON的对象结束。然后可以对其调用ToString(),但确切的格式将丢失

如果您想以特定的方式编写JSON,那么JRaw属性的内容将完全按照提供的方式编写


如果您能为我们提供更多的背景信息,说明您真正想要解决的问题,例如,为什么需要在模型中保留部分JSON?还有,你所说的“然而,这会破坏格式等”是什么意思;你能举个例子吗?最后,在显示转换器的一部分的部分中,您表示不希望每次都创建一个新的编写器。为什么这是一个如此大的问题?@brian:Json.Net中的格式化选项,因为这是与序列化程序关联的默认选项,但是,您可以使用序列化程序反序列化令牌来解决此问题。这种情况很简单,例如,
{“value\”:[1,2,3]}
应反序列化为带有
字符串的模型,而不是
int
(如上所述)。如果你更“手动”地使用
JsonTextReader
JsonTextWriter
而不是像上面那样使用转换器,那么你会获得更好的性能。如果你能给我们提供更多的上下文,说明你真正想解决的问题,也就是说,你为什么需要在模型中保留部分JSON,这将是很有帮助的?还有,你所说的“然而,这会破坏格式等”是什么意思;你能举个例子吗?最后,在显示转换器的一部分的部分中,您表示不希望每次都创建一个新的编写器。为什么这是一个如此大的问题?@brian:Json.Net中的格式化选项,因为这是与序列化程序关联的默认选项,但是,您可以使用序列化程序反序列化令牌来解决此问题。这种情况很简单,例如,
{“value\”:[1,2,3]}
应反序列化为带有
字符串的模型,而不是
int
(如上所述)。如果您使用更“手动”的
JsonTextReader
JsonTextWriter
而不是上述转换器,那么您会获得更好的性能。谢谢,最终在这些特定属性上使用了自定义JsonConverter。转换器检查是否存在
字符串、字符串[]
或其他。如果
string
,它将使用Writer.WriteToken(reader,true)读取节点和子结构。如果
string[]
它也会做同样的事情,除了使用读卡器读取底层数组,并重用编写器和StringBuilder来构建字符串的“数组”之外。编写器根据序列化程序获取设置。谢谢,最后在这些特定属性上使用了自定义JsonConverter。转换器检查是否存在
字符串、字符串[]
或其他。如果
string
,它将使用Writer.WriteToken(reader,true)读取节点和子结构。如果
string[]
它也会做同样的事情,除了使用读卡器读取底层数组,并重用编写器和StringBuilder来构建字符串的“数组”之外。编写器根据序列化程序获取设置。
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();
}