2012-10-14 25 views
1

類似於question,我有一個包含BsonDocument的幾個不同屬性類的類。將非結構化的BsonDocument作爲ApiController中的類屬性返回

public class Report 
{ 
    [BsonId, JsonIgnore] 
    public ObjectId _id { get; set; } 

    public string name { get; set; } 

    [JsonIgnore] 
    public BsonDocument layout { get; set; } 

    [BsonIgnore, JsonProperty(PropertyName = "layout")] 
    public string layout2Json 
    { 
     get { return layout.ToJson(); } 
    } 
} 

原因在那裏有BsonDocument,是佈局屬性是非結構化的,我不能有任何的強類型的子類。現在,當ApiController返回這個類,我得到的是這樣的:

{ 
    name: "...", 
    layout: "{type: "...", sth: "..."}" 
} 

但我需要的是佈局屬性爲對象,而不是字符串。

在JSON.NET中是否有一種方法將json-string(已經是有效的json)插入爲對象而不是字符串?

下面的作品,但似乎很浪費:

[BsonIgnore, JsonProperty(PropertyName = "layout")] 
public JObject layout2Json 
{ 
    get { return JObject.Parse(layout.ToJson()); } 
} 

回答

1

我有一個類似的問題。我解決它通過實現自定義JsonConverter,會做什麼,但寫的原始值(這已經是JSON)將JSON作者:

public class CustomConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return true; 
    } 

    public override object ReadJson(Newtonsoft.Json.JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 

    public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     writer.WriteRaw((string)value); 
    } 
} 

然後你使用它的自定義轉換器來裝飾它返回字符串屬性您BsonDocument對象的表示:

public class Report 
{ 
    [BsonId, JsonIgnore] 
    public ObjectId _id { get; set; } 

    public string name { get; set; } 

    [JsonIgnore] 
    public BsonDocument layout { get; set; } 

    [BsonIgnore, JsonProperty(PropertyName = "layout")] 
    [JsonConverter(typeof(CustomConverter))] 
    public string layout2Json 
    { 
     get { return layout.ToJson(); } 
    } 
} 

這樣一來,你擺脫了雙引號的問題,而非結構化的對象返回爲一個有效的JSON對象,而不是作爲一個字符串。希望這個幫助。

相關問題