我已经为我的一些对象添加了一个自定义属性,如下所示:
[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;
}
答案 0 :(得分:8)
如果您使用匿名对象怎么办?
JSON.Serialize(new { status = targetObject});
答案 1 :(得分:6)
这是专门针对Web API的解决方案,我也在使用它:RootFormatter.cs
我是根据Creating a JSONP Formatter for ASP.NET Web API写的。
我没有使用自定义属性,而是重用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"
}}
答案 2 :(得分:4)
一种非常简单的方法是将对象放在另一个对象中。它可能过于简单化了,但是这在处理集合和单个对象时起作用。
public class StatusDTO
{
public int StatusId { get; set; }
public string Name { get; set; }
public DateTime Created { get; set; }
}
public class statusJasonModel
{
public StatusDTO status { get; set; }
}
现在您将StatusDTO置于statusJsonModel对象中并将其序列化为Json。它应该给你你想要的答案。
答案 3 :(得分:-2)
我的一个项目遇到了类似的挑战。以下是我解决问题的步骤。
<强> 1。我的实体类
public class Product
{
[Key]
public string Id { get; set; }
public string Title { get; set; }
public string Album { get; set; }
public string Artist { get; set; }
public string Genre { get; set; }
}
<强> 2。创建了另一个类,以此形式定义。
public class KindOfMedia
{
public KindOfMedia()
{
Product = new List<Product>();
}
public List<Product> Product { get; set; }
}
第3。 Web API控制器,将返回json
public HttpResponseMessage Products()
{
var kind = new KindOfMedia();
kind.Products = new List<Product>();
kind.Products.Add(new Product
{
Id = Guid.NewGuid().ToString(),
Title = "I am A Winner",
Album = "",
Artist = "Project Fame",
Genre = "Contemporal"
});
kind.Products.Add(new Product
{
Id = Guid.NewGuid().ToString(),
Title = "Great Nation",
Album = "Oceans",
Artist = "Timi Dakolo",
Genre = "Gospel"
});
return Request.CreateResponse(HttpStatusCode.OK, kind);
}
<强> 4。将此行代码添加到App_Start文件夹中的WebApi配置文件
var json = config.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.None;
请注意 Newtonsoft.Json.PreserveReferencesHandling.None ,不会保留序列化类型的引用
结果Json是
{
"Musics": [
{
"Id": "bf9faeee-7c39-4c33-a0ea-f60333604061",
"Title": "I am A Winner",
"Album": "",
"Artist": "Project Fame",
"Genre": "Contemporal"
},
{
"Id": "243edd32-7ba2-4ac4-8ab9-bba6399cb0a6",
"Title": "Great Nation",
"Album": "Oceans",
"Artist": "Timi Dakolo",
"Genre": "Gospel"
}
]
}