Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从WebApi中的json对象列表中删除引用$id_C#_Json_Api_Json.net_Serialization - Fatal编程技术网

C# 从WebApi中的json对象列表中删除引用$id

C# 从WebApi中的json对象列表中删除引用$id,c#,json,api,json.net,serialization,C#,Json,Api,Json.net,Serialization,我想从更改我的响应数据格式 { "$id": "1", "$values": [ { "$id": "2", "OrderID": 3, "Article": null }, { "$id": "3", "OrderID": 4, "Article": null }

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

{
    "$id": "1",
    "$values": [
        {
            "$id": "2",
            "OrderID": 3,
            "Article": null
        },
        {
            "$id": "3",
            "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;
但是不起作用

控制器代码为this,其类继承自ApicController

    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;
        }
    }
  • 我认为,如果您正在使用Web API,为了明确操作的类型,您应该使用属性来修饰它们,例如
    [HttpGet]
    [HttpPost]
  • 在使用API时,我会使用
    dto
    对象而不是
    ViewModel
    对象,因为它不是纯MVC体系结构,许多客户端可以使用不同的方式使用API
  • 我宁愿返回一个BadRequest响应
    Request.CreateResponse(HttpStatusCode.BadRequest,“错误消息”)
    ,并在else语句中包含一些错误消息,而不是
    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; }
    }
    
    结果

    var isValid=true时

    var isValid=false时


    您能提供您的订单虚拟机代码吗?@AnonymousCodes回答否。您的代码来自.NETMVC项目,而不是.NETWebAPI项目。在.NET WebApi中,项目控制器不响应ActionResult对象。WebApi项目响应HttpActionResult对象。我的OrderVM对象的工作方式与您的OrderDto对象的工作方式相同。实际的解决方案是针对.net Framework的,我已经更改了您的代码,但结果是一样的=/如果我用[JsonObject(IsReference=false)]装饰OrderDto.cs类,我可以从json order对象中删除$id属性,但是现在不是ResponseMetry的第一个$id和$value,如果仍然不起作用,请从
    WebApiConfig
    Register
    方法添加代码?
    public class OrderDto
    {
        public int OrderID { get; set; }
    
        public string Article { get; set; }
    }
    
    [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; }
    }
    
    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);
    }