1

この質問と同様に、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 がある理由は、レイアウト プロパティが構造化されておらず、厳密に型指定されたサブクラスを持つことができないためです。ApiController がこのクラスを返すと、次のようになります。

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

しかし、私が必要としているのは、文字列ではなく、オブジェクトとしてのレイアウト プロパティです。

JSON.NET で json-string (既に有効な json) を文字列ではなくオブジェクトとしてプラグインする方法はありますか?

以下は機能しますが、非常に無駄に思えます。

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

1 に答える 1

1

同様の問題がありました。Jsonライターに生の値(すでにJsonである)を書き込むだけのカスタムJsonConverterを実装することで解決しました:

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 オブジェクトとして返されます。この助けを願っています。

于 2012-10-24T14:01:19.597 に答える