有可能告诉JSON.NET我有一个带有JSON数据的字符串吗?我有一个这样的课:
public class Foo
{
public int Id;
public string RawData;
}
Run Code Online (Sandbox Code Playgroud)
我用的是这样的:
var foo = new Foo();
foo.Id = 5;
foo.RawData = @"{""bar"":42}";
Run Code Online (Sandbox Code Playgroud)
我希望像这样序列化:
{"Id":5,"RawData":{"bar":42}}
Run Code Online (Sandbox Code Playgroud)
基本上我有一块非结构化的可变长度数据已经存储为JSON,我需要完全序列化的对象来包含这些数据作为一部分.
谢谢.
编辑:只是为了确保它被正确理解,这是单向序列化,即我不需要它反序列化回同一个对象; 另一个系统应处理此输出.我需要将RawData的内容作为JSON的一部分,而不仅仅是字符串.
小智 21
你需要一个转换器才能做到这一点,这是一个例子:
public class RawJsonConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteRawValue(value.ToString());
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override bool CanConvert(Type objectType)
{
return typeof(string).IsAssignableFrom(objectType);
}
public override bool CanRead
{
get { return false; }
}
}
Run Code Online (Sandbox Code Playgroud)
然后用它装饰你的课:
public class Foo
{
public int Id;
[JsonConverter(typeof(RawJsonConverter))]
public string RawData;
}
Run Code Online (Sandbox Code Playgroud)
然后,当你使用:
var json = JsonConvert.SerializeObject(foo,
new JsonSerializerSettings());
Console.WriteLine (json);
Run Code Online (Sandbox Code Playgroud)
这是你的输出:
{"Id":5,"RawData":{"bar":42}}
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你
编辑:我已经更新了我的答案以获得更有效的解决方案,前一个强制您序列化然后反序列化,但事实并非如此.