如何使Web API以所需的格式返回JSON?

12 浏览
0 Comments

如何使Web API以所需的格式返回JSON?

我在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

}, {...}

}

0
0 Comments

问题的原因是用户希望将Web API返回的JSON数据格式化为特定的结构。解决方法是创建一个DTO类,该类具有用户想要返回的确切结构。然后将result中项目的结构映射到PhuketDTO并将DTO列表分配给Ok,就像当前对result所做的那样。

由于用户的背景基于vb.net和linq,所以用户希望得到一个示例。

回答者建议用户检查需要返回的JSON的结构,并将其转换为C#类的结构。如果用户在这方面遇到困难,可以再次寻求帮助。

用户坦率地说,确实遇到了困难。

0
0 Comments

问题的出现的原因:

提问者最初以为自己遇到了一个关于如何在Web API中返回JSON的问题,但后来意识到自己提出的问题是错误的。

解决方法:

1. 创建用于JSON的类。

2. 使用JavaScriptSerializer进行反序列化。

3. 使用AutoMapper进行映射。

以下是整理好的文章:

你可以尝试使用AutoMapper。

1. 为你的JSON创建类

在使用之前,你需要将JSON对象转换为C#类。可以尝试使用这个或这个。

如果你在定义类时遇到问题,下面是我认为适合你的代码。

第一个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. 使用JavaScriptSerializer进行反序列化:

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

3. 使用AutoMapper进行映射:

假设你的第一个JSON表示类`JsonClassA`,第二个JSON表示类`JSONClassB`。

使用AutoMapper可以很容易地完成这个过程,并从你的控制器返回结果。

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

看起来很棒。我来尝试一下这个解决方案。

你的解决方案是否类似于这个?stackoverflow.com/questions/21657122/...

.shedko 不,我看过你发的链接,那是一个完全不同的问题和答案。这个解决方案对你有用吗?

还没有尝试。我会告诉你的。

jsonInput应该是LINQ查询的结果(var result),对吗?

伙计们,非常感谢你们的帮助,但是我问错了问题。

0