JSON.NET:将JSON字符串属性序列化为JSON对象



是否可以告诉JSON.NET我有一个包含JSON数据的字符串?例如,我有一个这样的类:

public class Foo
{
    public int Id;
    public string RawData;
}

我用的是这样的:

var foo = new Foo();
foo.Id = 5;
foo.RawData = @"{""bar"":42}";

我想这样序列化:

{"Id":5,"RawData":{"bar":42}}

基本上,我已经有一段存储为JSON的非结构化可变长度数据,我需要完全序列化的对象来包含这些数据。

谢谢。

EDIT:只是为了确保它被正确理解,这是单向序列化,即我不需要它反序列化回同一个对象;另一个系统将处理该输出。我需要RawData的内容成为JSON的一部分,而不仅仅是一个字符串。

您需要一个转换器来实现这一点,下面是一个示例:

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)
   {
        using (var stringWriter = new StringWriter(CultureInfo.InvariantCulture)) 
        {
            using (var jsonTextWriter = new JsonTextWriter(stringWriter))
            {
                jsonTextWriter.WriteToken(reader);
                var result = stringWriter.ToString();
                return result;
            }
        }
   }
   public override bool CanConvert(Type objectType)
   {
       return typeof(string).IsAssignableFrom(objectType);
   }
   
   public override bool CanRead
   {
       get { return true; }
   }   
}

然后用它装饰你的课堂:

public class Foo
{
    public int Id;
    [JsonConverter(typeof(RawJsonConverter))]
    public string RawData;
}

然后,当你使用:

var json = JsonConvert.SerializeObject(foo,
                                    new JsonSerializerSettings());
Console.WriteLine (json);

这是您的输出:

{"Id":5,"RawData":{"bar":42}}

希望它能帮助

编辑:我已经更新了我的答案,以获得更高效的解决方案,上一个解决方案迫使您先序列化,然后反序列化,但这并没有。

编辑,5/11/2023:更改JsonConverter以支持反序列化。

使用JRaw可能是更合适、更紧凑的解决方案

请参阅本文

您可以使用另一个属性来反序列化对象属性json。

public class Foo
{
    public int Id;
    public string RawData;
    private object thisObject;
    public object ThisObject 
    {
        get
        {
            return thisObject ?? (thisObject = JsonConvert.DeserializeObject<object>(RawData));
        }
    }        
}

相关内容

  • 没有找到相关文章

最新更新