从Web Api中的json对象列表中删除引用$ id

问题描述 投票:1回答:1

我想改变我的响应数据格式

{
    "$id": "1",
    "$values": [
        {
            "$id": "2",
            "OrderID": 3,
            "Article": null
        },
        {
            "$id": "3",
            "OrderID": 4,
            "Article": null
        }
     ]
}

 [
    {
        "OrderID": 3,
        "Article": null
    },
    {
        "OrderID": 4,
        "Article": null
    }
 ]

我尝试在WebApiConfig.cs文件中配置JsonFormatter,添加这两行

config.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.None;
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;

但不起作用。

控制器代码是这个,它的类继承自ApiController

    public List<OrderDto> Get()
    {
        var serviceResult = orderService.LoadOrders();

        if (serviceResult.IsValid)
        {
            var orders = serviceResult.GetObject();

            var ordersDto = Mapper.Map<List<Order>, List<OrderDto>>(orders);

            return ordersDto;
        }
        else
        {
            return null;
        }
    }

对此解决方案有什么想法?

编辑1:

订购.vs代码

public class OrderDto
{
    public int OrderID { get; set; }

    public string Article { get; set; }
}
c# json api json.net serializer
1个回答
6
投票
  1. 我相信,如果您使用的是Web API,那么为了阐明操作的类型,您应该使用属性来修饰它们,例如: [HttpGet][HttpPost]
  2. 在使用API​​时,我会使用Dtos对象而不是ViewModel对象,因为它不是纯粹的MVC架构,许多客户端可以使用不同的方式使用您的API。
  3. 我宁愿在你的else语句中返回一个BadRequest响应Request.CreateResponse(HttpStatusCode.BadRequest, "error message"),而不是null。这将是一个快速的解决方案,但我会考虑在您的服务的实现中抛出异常,并基于此返回正确的错误消息回客户端。

这应该工作:

[System.Web.Http.HttpGet]
public HttpResponseMessage GetAllOrders()
{
    //var serviceResult = orderService.LoadOrders();
    // var isValid = serviceResult.IsValid
    var isValid = true;
    if (isValid)
    {
        // I used hardcoded values here just to show how to return a proper result
        // you can call your service instead and do the mapping/other stuff

        var result = new List<OrderDto>()
        {
            new OrderDto(){
                OrderID = 3,
                Article = "blah1"
            },
            new OrderDto(){
                OrderID = 4,
                Article = "blah2"
            }
        };
        return Request.CreateResponse(HttpStatusCode.OK, result);
    }
    else
    {
        return Request.CreateResponse(HttpStatusCode.BadRequest, "Error Message");

    }
}

public class OrderDto
{
    public int OrderID { get; set; }

    public string Article { get; set; }
}

WebApiConfig.cs内容:

public static void Register(HttpConfiguration config)
{
    // Web API configuration and services

    // Web API routes
    config.MapHttpAttributeRoutes();

    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );

    var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
    config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
}

结果

var isValid = true;

enter image description here

var isValid = false;

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.