C# 在ApiController中将非结构化BsonDocument作为类属性返回

C# 在ApiController中将非结构化BsonDocument作为类属性返回,c#,mongodb,asp.net-web-api,json.net,mongodb-.net-driver,C#,Mongodb,Asp.net Web Api,Json.net,Mongodb .net Driver,与此类似,我有一个具有几种不同属性类型的类,包括BsonDocument public class Report { [BsonId, JsonIgnore] public ObjectId _id { get; set; } public string name { get; set; } [JsonIgnore] public BsonDocument layout { get; set; } [BsonIgnore, JsonPrope

与此类似,我有一个具有几种不同属性类型的类,包括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属性是非结构化的,并且我不能有任何强类型的子类。现在,当ApicController返回这个类时,我得到如下结果:

{
    name: "...",
    layout: "{type: "...", sth: "..."}"
}
但我需要的是布局属性作为对象,而不是字符串

在JSON.NET中有没有办法将JSON字符串(已经是有效的JSON)作为对象而不是字符串插入

以下方法可行,但似乎相当浪费:

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

我也有类似的问题。我通过实现一个自定义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对象而不是字符串返回。希望这有帮助。

我也有类似的问题。我通过实现一个自定义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对象而不是字符串返回。希望这有帮助