JSON根节点 - 与类名不同

时间:2016-03-22 00:04:25

标签: c# json asp.net-web-api

我需要让我的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。我可以将属性应用于该属性吗?

任何帮助都将不胜感激。

2 个答案:

答案 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,则需要进行以下修改:

  1. 将Person对象包装在包装器中并为其分配JsonProperty

     [JsonObject]
     public class Wrapper
     {
       [JsonProperty("User")]
       public Person Person {get; set;}
     }
    
  2. 现在也在Person类中使用相同的JsonProperty

     [JsonObject]
     public class Person
     {
       [JsonProperty("FirstName")]
       public string GivenName {get; set;}
    
       [JsonProperty("LastName")]
       public string FamilyName {get; set;}
    
       ... More Properties
     }
    
  3. 现在在填写响应时。以下需要完成:

    Wrapper w = new Wrapper();
    w.Person = <assign Value>
    return Request.CreateResponse(HttpStatusCode.OK, w);
    

    Json不同的最后一件事XML没有根节点的概念,它是无名的,这就是为什么包装器不会到达任何地方并且它将从标记为{{的第一个对象开始1}}在这种情况下,User类似于Json,内部是键值对,因为键总是字符串