API接受一个对象,作为json传递一个对象,只接受对象的顶层

本文关键字:一个对象 对象 json 作为 API | 更新日期: 2023-09-27 18:03:02

我有一个接受Order类的WebAPI。我创建Order类并将其序列化,将其转换为字符串,并将其传递给我的web api。数据都在那里,但是当我在API端对其进行反序列化时(仅用于测试,因为我得到了一个空引用错误),我的大多数对象都返回为空(除了对象的顶层)

订单类

:

 [Serializable]
    public class Order
    {
        public Address Address { get; set; }
        public DateTime OrdereDate { get; set; }
        public DateTime DeliveryDate { get; set; }
        public IList<Product> ProductList { get; set; }
    }

我调用api方法的原始Json字符串是这样的

{
    "Address" : {
        "AddressLine1" : "line1",
        "AddressLine2" : "",
        "City" : "Test",
        "Province" : "ON",
        "PostalCode" : "90210",
        "Country" : "US",
        "Email" : "test@gmail.com",
        "Phone" : "234567876"
    },
"OrdereDate" : "'/Date(1400198100000)'/",
    "DeliveryDate" : "'/Date(1400753100000)'/",
"ProductList" : [{
            "ProductCode" : "GT",
            "Name" : null,
            "Description" : null,
        }, {
            "ProductCode" : "CI",
            "Name" : null,
            "Description" : null,
        }
    }

这是传递给API的内容,但是如果我将对象反序列化回Order对象,则Address和ProductList都为空。

编辑:其他类也被标记为序列化

 [Serializable]
    public class Product
    {
        public string ProductCode { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
    }
  [Serializable]
    public class Address
    {
        public string AddressLine1 { get; set; }
        public string AddressLine2 { get; set; }
        public string City { get; set; }
        public string Province { get; set; }
        public string PostalCode { get; set; }
        public string Country { get; set; }
        public string Email { get; set; }
        public string Phone { get; set; }
    }

序列化/API调用

WebClient client = new WebClient();
                JavaScriptSerializer js = new JavaScriptSerializer();
                client.Headers[HttpRequestHeader.ContentType] = "application/json";
                string serialisedData = js.Serialize(order);
                var response = client.UploadString("mysite.com/Order/NewOrder", serialisedData);

API接受一个对象,作为json传递一个对象,只接受对象的顶层

这是一个快速的方法:从类中删除[Serializable]属性,然后再试一次。Web API的工作方式与WCF不同,这些属性是为WCF设计的。这通常足以使事情正常工作。

注意:如果你需要做更深层次的JSON映射,web API不像其他JSON库那么成熟。幸运的是,您可以在JSON之上放置其他JSON序列化器。NET包含在内,因此您可以使用它的方法(和属性)来进行序列化,这比开箱即用要好得多。这是我的方向,如果你需要更多的JSON序列化/反序列化支持。