Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.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# 序列化复杂对象并将值添加到参数列表中_C#_Json_Restsharp - Fatal编程技术网

C# 序列化复杂对象并将值添加到参数列表中

C# 序列化复杂对象并将值添加到参数列表中,c#,json,restsharp,C#,Json,Restsharp,我使用了一个api,该api要求我根据发送的所有参数的值,使用一些散列算法来计算请求的签名。如果签名有误,我的请求将被拒绝。因此,对我来说,有一个我发送的所有参数的列表是很重要的 我正试图发送一个复杂的对象: public class InboundShipmentPlan { public InboundShipmentPlan() { InboundShipment

我使用了一个api,该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; }
        }
我正在计算验证器中的签名。我的问题是request.AddBody没有将我的JSON对象属性添加到参数列表(request.parameters)中,因此我的签名是错误的。方法request.AddObject会将它们添加到请求参数列表中,但此方法的问题是对象未序列化,因此复杂属性(地址等)的值类似于:System.Collection.Generic.list

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

更新

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

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

您可以避免使用泛型进行序列化,而是使用数组

也可以使用DataContractSerializer

执行后,结果将是正确的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"}
这样,您就可以将对象毫无问题地传递到服务器端


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

谢谢,但这并不能回答我的问题,我可以序列化对象。我的问题是我需要将所有嵌套对象的属性单独添加到参数列表中,所以我真的误解了你的问题。您发送带有参数的post请求。如果您添加序列化字符串作为参数,那么您可以在另一侧检查它,我遗漏了什么?感谢您对我的问题Vladimir感兴趣。我的问题是,我需要在发送请求之前获取我这边(客户端)的参数列表(这是为了创建一个签名,该签名需要基于我发送的所有参数的列表。但是,如果我向请求中添加一个复杂对象,由两个字符串属性组成,一个属性是另一个长度为n的复杂类型的列表,那么它只会添加一个包含JSON字符串的参数,而不是2+n参数。)埃特斯。
var ser = new DataContractJsonSerializer(shipmentPlan.GetType());
        var stream = new MemoryStream();
        ser.WriteObject(stream, shipmentPlan);
        var result = Encoding.Default.GetString(stream.ToArray());
{"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"}