我需要让我的JSON输出看起来像这样:
{
"User": {
"Id" : "1",
"FirstName" : "John",
"LastName" : "Doe",
... etc
我的第一个问题是,此处序列化的类名称为Person
而不是User
,我无法更改。但是JSON需要User
。
其次,我的Web API方法根本没有返回根节点,我究竟做错了什么?
我的JSON看起来像这样:
{"Id":1,"BossId":null,"Title":"CEO","GivenName":"Doe", ... etc
格式非常糟糕,即使我的Chrome扩展程序使JSON漂亮也无法识别这些内容。
这是我的Web API控制器,用于通过ID获取用户,这导致上述内容:
[Route("{id:int}")]
public HttpResponseMessage GetPerson(int id) {
Person person = repository.Get(id);
if (person == null) {
throw new HttpResponseException(HttpStatusCode.NotFound);
}
return Request.CreateResponse(HttpStatusCode.OK, person);
}
我还必须在这里将类属性映射到不同的名称,这是一个单独的问题。
例如,该类具有GivenName和FamilyName,但JSON需要FirstName和LastName。我可以将属性应用于该属性吗?
任何帮助都将不胜感激。
答案 0 :(得分:3)
ASP.NET WebApi使用JSON.NET对json进行序列化。所以你可以这样改名:
class Person
{
[JsonProperty(PropertyName = "LastName")]
public string FamilyName { get; set; }
...
}
修改强>
要添加根元素,请查看此answer。我没试过,但看起来不错。
答案 1 :(得分:1)
假设您使用Newtonsoft Json.Net
,最受欢迎的.Net Json serializer
,则需要进行以下修改:
将Person对象包装在包装器中并为其分配JsonProperty
:
[JsonObject]
public class Wrapper
{
[JsonProperty("User")]
public Person Person {get; set;}
}
现在也在Person类中使用相同的JsonProperty
:
[JsonObject]
public class Person
{
[JsonProperty("FirstName")]
public string GivenName {get; set;}
[JsonProperty("LastName")]
public string FamilyName {get; set;}
... More Properties
}
现在在填写响应时。以下需要完成:
Wrapper w = new Wrapper();
w.Person = <assign Value>
return Request.CreateResponse(HttpStatusCode.OK, w);
与Json
不同的最后一件事XML
没有根节点的概念,它是无名的,这就是为什么包装器不会到达任何地方并且它将从标记为{{的第一个对象开始1}}在这种情况下,User
类似于Json
,内部是键值对,因为键总是字符串