【问题标题】:Remove reference $id from json object list in WebApi从 WebApi 中的 json 对象列表中删除引用 $id
【发布时间】:2019-02-22 12:07:39
【问题描述】:

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

{
    "$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:

OrderDto.cs 代码

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

    public string Article { get; set; }
}

【问题讨论】:

  • 您能提供您的 OrderVM 代码吗?
  • @AnonymousCodes 已回答

标签: c# json api json.net serialization


【解决方案1】:
  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;

var isValid = false;

【讨论】:

  • 不。您的代码来自 .NET MVC 项目,而不是来自 .NET WebApi 项目。在 .NET WebApi 项目控制器中不响应 ActionResult 对象。 WebApi 改为投射响应 HttpActionResult 对象。我的 OrderVM 对象的工作方式与您的 OrderDto 对象相同。
  • 对不起,我想快速 IActionResult 来自 .net 核心。实际解决方案是针对 .net 框架
  • 我已经改变了你的代码,但结果是一样的 =/
  • 如果我用 [JsonObject(IsReference = false)] 装饰我的 OrderDto.cs 类,我可以从 json 订单对象中删除 $id 属性,但不能从响应中删除第一个 $id 和 $values
  • 请立即尝试,如果仍然无法使用,请添加WebApiConfig Register 方法中的代码?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-03
  • 2016-03-01
  • 2020-04-17
  • 1970-01-01
  • 2011-05-21
相关资源
最近更新 更多