使用json.NET(C#)从json中以字符串形式读取子对象



我正在读取一个大对象,其中包含数千个子对象,出于性能原因,我不想将这些子对象反序列化为完整的C#对象,而只是将它们作为伪包装器对象加载,以将它们的JSON保持为字符串(用于稍后再次序列化的阶段(
到目前为止,我有以下概念代码(不是最终代码(,但我更愿意避免JObject的创建,而只是以某种方式将子对象字符串直接从读取器读取到包装器json成员字符串中。有没有一种简单的方法可以做到这一点,而无需切换所有可能的令牌并逐一读取它们?

namespace Playground
{
[JsonConverter(typeof(ObjectJsonWrapperConverter))]
public class ObjectJsonWrapper
{
public string Json;
}
public class ObjectJsonWrapperConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteRawValue(((ObjectJsonWrapper)value).Json);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var wrapper=new ObjectJsonWrapper();
if (reader.TokenType == JsonToken.Null)
{
return null;
}
else if (reader.TokenType == JsonToken.StartObject)
{
var obj=JsonConvert.SerializeObject(JObject.Load(reader));
wrapper.Json = obj;
return wrapper;
}
else
{
throw new ArgumentException("Bad parsing");
}
}
public override bool CanConvert(Type objectType)
{
throw new NotImplementedException();
}
}
}
  • 已经看到另一个问题,但它不能满足我的需求

如果我理解正确的话,您想要的是将JsonReader的内容持久化为字符串,而JRaw就是这样做的。

class ObjectJsonWrapperConverter : JsonConverter
{
public override bool CanConvert(Type objectType) => true;
public override object ReadJson(JsonReader reader, Type objectType, 
object existingValue, JsonSerializer serializer)
{
// This creates a raw JSON string without parsing it.
var raw = JRaw.Create(reader);
var obj = new ObjectJsonWrapper();
obj.Json = (string)raw.Value;
return obj;
}
public override void WriteJson(JsonWriter writer, object value, 
JsonSerializer serializer)
{
throw new NotImplementedException();
}
}

使用它:

public class MyObject
{
public ObjectJsonWrapper LargeObject { get; set; }
}
[JsonConverter(typeof(ObjectJsonWrapperConverter))]
public class ObjectJsonWrapper
{
public string Json { get; set; }
}
var json = @"
{
""largeObject"": {
""value"": ""some value""
}
}   
";
var obj = JsonConvert.DeserializeObject<MyObject>(json);