【问题标题】:Serializing a complex object AND having the values added to the list of parameters序列化复杂对象并将值添加到参数列表中
【发布时间】:2015-03-06 09:33:32
【问题描述】:

我使用了一个 API,它要求我根据我发送的所有参数的值使用某种散列算法来计算我的请求的签名。如果签名错误,我的请求将被拒绝。因此,对我来说,列出我要发送的所有参数很重要。

我有一个想要发送的复杂对象:

public class InboundShipmentPlan
            {
                public InboundShipmentPlan()
                {
                    InboundShipmentPlanRequestItems = new List<InboundShipmentPlanRequestItem>();
                }

            public Address ShipFromAddress { get; set; }
            public string ShipToCountryCode { get; set; }
            public string LabelPrepPreference { get; set; }
            public List<InboundShipmentPlanRequestItem> InboundShipmentPlanRequestItems { get; set; }
        }

        public class Address
        {
            public string Name { get; set; }
            public string AddressLine1 { get; set; }
            public string AddressLine2 { get; set; }
            public string City { get; set; }
            public string DistrictOrCounty { get; set; }
            public string CountryCode { get; set; }
            public string PostalCode { get; set; }
        }

        public class InboundShipmentPlanRequestItem
        {
            public string Prop1{ get; set; }
            public string Prop2 { get; set; }
            public string Condition { get; set; }
            public int Quantity { get; set; }
        }

这是我正在做的:

    InboundShipmentPlanRequestItem item = new InboundShipmentPlanRequestItem
        {
            Prop1 = "My",
            Prop2 = "Zorro",
            Quantity = 2
        };

        Address shipmentPlanShipFromAddress = new Address
        {
            AddressLine1 = "25 Courtfield Garden",
            City = "London",
            CountryCode = "UK",
            PostalCode = "SW5 OPG",
            Name = "The Naddler"
        };

        InboundShipmentPlan shipmentPlan = new InboundShipmentPlan
        {
            ShipToCountryCode = "US",
             ShipFromAddress = shipmentPlanShipFromAddress
        };

        shipmentPlan.InboundShipmentPlanRequestItems.Add(item);

        var client = new RestClient(endpointAdresss) {Authenticator = new CustomAuthenticator()};
        var request = new RestRequest(Method.POST) {Resource = "SomeAction/2010-10-01"};
        request.RequestFormat = DataFormat.Json;
        request.AddParameter("Action", "CreateInboundShipmentPlan");
        //var serializedObject = JsonConvert.SerializeObject(shipmentPlan);
        request.AddBody(shipmentPlan);
        var response = client.Execute(request);

我正在计算 Authenticator 中的签名。我的问题是 request.AddBody 没有将我的 JSON 对象属性添加到参数列表(request.Parameters)中,因此我的签名是错误的。方法 request.AddObject 确实将它们添加到请求参数列表中,但此方法的问题是对象未序列化,因此复杂属性(地址等)具有如下值:System.Collection.Generic .列表。

我该如何解决这个问题?谢谢

更新

我发现,当我使用AddJsonObject时,它实际上添加了一个名为“application/json”的参数,其值为JSON字符串。但是,我需要的是,如果我有一个包含 2 个字符串属性和一个属性的复杂类型,该属性是长度为 n 的复杂类型的列表,则将 2 + n 个单独的参数添加到请求中,而不仅仅是一个 JSON 字符串。

一种解决方法是解析 JSON 字符串并将其转换为键值字典,但我还没有找到通用实现并且不确定是否值得深入研究。到目前为止,我找到的所有解决方案都是基于这样一个事实,即作者事先知道他试图展平的 JSON 对象的结构。

【问题讨论】:

    标签: c# json restsharp


    【解决方案1】:

    您可以避免使用 Generics 进行序列化,而使用 Arrays

    您也可以使用DataContractSerializer

    var ser = new DataContractJsonSerializer(shipmentPlan.GetType());
            var stream = new MemoryStream();
            ser.WriteObject(stream, shipmentPlan);
            var result = Encoding.Default.GetString(stream.ToArray());
    

    执行后结果会是正确的JSON字符串:

    {"InboundShipmentPlanRequestItems":[{"ASIN":"Zorro","Condition":null,"Quantity":2,"SellerSKU":"My"}],"LabelPrepPreference":null,"ShipFromAddress":{"AddressLine1":"25 Courtfield Garden","AddressLine2":null,"City":"London","CountryCode":"UK","DistrictOrCounty":null,"Name":"The Naddler","PostalCode":"SW5 OPG"},"ShipToCountryCode":"US"}
    

    这样你就可以毫无问题地将对象传递到服务器端。

    如果您确实需要某个散列算法的对象的所有参数,那么您应该在对象内部创建方法,该方法将生成可以添加为参数的散列序列。

    【讨论】:

    • 谢谢,但这不能回答我的问题,我没有问题序列化对象。我的问题是我需要将所有嵌套对象的属性单独添加到参数列表中
    • 所以我真的误解了你的问题。您发送带有参数的发布请求。如果您添加序列化字符串作为参数,那么您可以在另一边检查它,我错过了什么?
    • 感谢您对我的问题 Vladimir 感兴趣。我的问题是我需要在发送请求之前获取我方(客户端)的参数列表(这是为了创建一个签名,该签名需要基于我发送的所有参数的列表。但是,如果我在我的请求中添加了一个复杂对象,例如 2 个字符串属性和一个属性,它是另一种长度为 n 的复杂类型的列表,它只会添加一个包含 JSON 字符串的参数,而不是 2 + n 个参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多