如何使web api以所需的格式返回json?

时间:2014-03-26 12:35:50

标签: json asp.net-web-api

我在web api中使用以下代码返回json:

所以,这是dto类。但目前尚不清楚如何将其映射到结果。

public class grafikresult
{
    int kodg { get; set; }
    string name { get; set; }
    DateTime data { get; set; }
    byte pax { get; set; }
    byte ch { get; set; }
}  

这是控制器代码:

// GET api/Grafik/5
    public IHttpActionResult GetGrafik(int id)
    {
        PhuketEntities db = new PhuketEntities();
        xTourist t = db.xTourist.Find(id);
        var result = from a in db.Grafik
                     join b in db.Exc on a.Excursion equals b.Kod
                     join c in db.Dates on a.Kodd equals c.kodd
                     join d in db.Staff on a.Guide equals d.Kod
                     where c.Date > t.ArrDate && c.Дата < t.DepDate
                     select new { kodg = a.Kodg, name = d.Name, data = c.Date, pax = t.Pax, ch = t.Child };
        return Ok(result);
    }

这样会返回新的json:

{
    "$id": "1",
    "$values": [{
        "$id": "2",
        "kodg": -1643387437,
        "name": null,
        "data": "2014-02-07T00:00:00",
        "pax": 2,
        "ch": 0
    }, {...}]
}

如何更改web api控制器代码才能获得此json:

{
    "$id": "1",
    "kodg": -1643387437,
    "name": null,
    "data": "2014-02-07T00:00:00",
    "pax": 2,
    "ch": 0
    }, {...}
}

2 个答案:

答案 0 :(得分:3)

您可以尝试使用AutoMapper

1。为您的Json

创建类

在使用之前,您需要将JSON对象转换为C#类。试试thisthis

如果您在定义课程时遇到问题,我认为应该适合您。

第一个json的类。

public class JsonClassA
{
    int id{ get; set; }
    Details values { get; set; }
}  

public class Details
{
    int kodg { get; set; }
    string name { get; set; }
    DateTime data { get; set; }
    byte pax { get; set; }
    byte ch { get; set; }
} 

第二个json的等级。

public class JSONClassB
{
    int kodg { get; set; }
    string name { get; set; }
    DateTime data { get; set; }
    byte pax { get; set; }
    byte ch { get; set; }
} 

2。使用JavaScriptSerialize反序列化:

JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
JsonClassA jsonClassA = jsonSerializer.Deserialize<JsonClassA>(jsonInput)

3。使用Automapper进行地图

假设您的第一个Json代表类JsonClassA,而您的第二个JSON代表类JSONClassB

使用Automapper,可以按照以下方式轻松完成,并从控制器返回。

JSONClassB finalOutput = AutoMapper.CreateMap<JsonClassA, JSONClassB>()
      .ForMember(dest => dest.prop1, opts => opts.MapFrom(src => src.propAAA))
      .ForMember(dest => dest.prop2, opts => opts.MapFrom(src => src.propBBB));
return Ok(finalOutput );

答案 1 :(得分:2)

创建一个具有您需要返回的确切结构的DTO类。然后,您可以将result上的项目结构映射到PhuketDTO,并将DTO列表分配给Ok,就像您目前为result所做的那样。