2013-07-11 159 views
13

是否可以告诉JSON.NET我有一个JSON数据字符串?例如。我有这样一个类:JSON.NET:将json字符串属性序列化为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的一部分,而不是单纯的字符串。

+0

是有可能的,但你能告诉我到底什么是你所需要的输出?目前它是:{“Id”:5,“RawData”:“{\”bar \“:42}”} – 2013-07-11 04:36:11

+0

@河,这正是我需要的。我有一个JSON内容的字符串属性,我认为它仅仅用于序列化为JSON的目的是无用的。 – port443

+0

@河,对不起,我没有足够好的读你的例子。在你的情况下,在JSON中RawData的内容是字符串,我需要它是一个子对象(即你的变体有额外的引号和反斜杠) – port443

回答

16

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

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

希望它可以帮助

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

+0

我必须自己尝试,但看起来像它解决了我的问题。 @Rivers。 – port443

0

您可以使用其他属性反序列化对象属性json。

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