21

是否可以告诉 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,我需要完全序列化的对象来包含这些数据作为一部分。

谢谢。

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

4

3 回答 3

23

你需要一个转换器来做到这一点,这是一个例子:

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; }
   }   
}

然后用它装饰你的班级:

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}}

希望能帮助到你

编辑:我已经更新了我的答案以获得更有效的解决方案,前一个强制你序列化然后反序列化,这不是。

于 2013-07-11T19:15:02.693 回答
5

有可能,使用JRaw可能是更合适和更合适的解决方案

看到这个帖子

于 2017-08-06T13:36:18.963 回答
4

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

public class Foo
{
    public int Id;
    public string RawData;
    private object thisObject;
    public object ThisObject 
    {
        get
        {
            return thisObject ?? (thisObject = JsonConvert.DeserializeObject<object>(RawData));
        }
    }        
}
于 2015-01-29T02:17:14.810 回答