14

次のように、いくつかのオブジェクトにカスタム プロパティを追加しました。

[JsonCustomRoot("status")]
public class StatusDTO 
{
    public int StatusId { get; set; }
    public string Name { get; set; }
    public DateTime Created { get; set; }
}

属性は非常に単純です。

public class JsonCustomRoot :Attribute
{
    public string rootName { get; set; }

    public JsonCustomRoot(string rootName)
    {
        this.rootName = rootName;
    }
}

オブジェクトのインスタンスをシリアル化するときの JSON.NET からの既定の出力は次のとおりです。

{"StatusId":70,"Name":"Closed","Created":"2012-12-12T11:50:56.6207193Z"}

問題は次のとおりです。次のように、カスタム属性の値を使用して JSON にルートノードを追加するにはどうすればよいですか。

{status:{"StatusId":70,"Name":"Closed","Created":"2012-12-12T11:50:56.6207193Z"}}

IContractResolverインターフェイスについて言及している記事をいくつか見つけましたが、その方法を理解できません。私の試みには、この未完成のコードが含まれています。

protected override JsonObjectContract CreateObjectContract(Type objectType)
{
    JsonObjectContract contract = base.CreateObjectContract(objectType);

    var info = objectType.GetCustomAttributes()
                   .SingleOrDefault(t => (Type)t.TypeId==typeof(JsonCustomRoot));
    if (info != null)
    {
        var myAttribute = (JsonCustomRoot)info;
        // How can i add myAttribute.rootName to the root from here?
        // Maybe some other method should be overrided instead?
    }

    return contract;
}
4

4 に答える 4

13

匿名オブジェクトを使用するとどうなりますか?

JSON.Serialize(new { status = targetObject});
于 2012-12-12T12:10:12.947 に答える
6

これは、私も使用している Web API 専用のソリューションです: RootFormatter.cs

ASP.NET Web API 用の JSONP フォーマッターの作成に基づいて作成しました。

カスタム属性を使用する代わりに、の Title フィールドを再利用していますJsonObjectAttribute。使用コードは次のとおりです。

using Newtonsoft.Json

[JsonObject(Title = "user")]
public class User
{
    public string mail { get; set; }
}

次に、RootFormatter を App_Start に追加し、次のように に登録しますWebApiConfig

GlobalConfiguration.Configuration.Formatters.Insert(0, new RootFormatter());

WCF のようなラップされた応答を得ることができましたWebMessageBodyStyle.Wrapped:

{"user":{
  "mail": "foo@example.com"
}}
于 2013-01-17T06:33:35.447 に答える