与此question类似,我有一个包含多种不同属性类型的类,包括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")]
public string layout2Json
{
get { return layout.ToJson(); }
}
}
在那里使用BsonDocument的原因是layout-property是非结构化的,我不能拥有任何强类型的子类。现在当ApiController返回这个类时,我会得到这样的结果:
{
name: "...",
layout: "{type: "...", sth: "..."}"
}
但我需要的是layout-property作为对象,而不是字符串。
JSON.NET中是否有一种方法可以将json-string(已经是有效的json)作为对象插入而不是字符串?
以下作品,但似乎很浪费:
[BsonIgnore, JsonProperty(PropertyName = "layout")]
public JObject layout2Json
{
get { return JObject.Parse(layout.ToJson()); }
}
答案 0 :(得分:1)
我有类似的问题。我通过实现一个自定义的JsonConverter来解决它,它只会将原始值(已经是Json)写入Json writer:
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对象返回,而不是作为字符串返回。希望这有帮助。