将对象序列化为 URL 参数字符串 - 包括嵌套对象的属性 [英] Serialise an object to URL parameter string - Including properties from nested objects
问题描述
我有一个类,其中包含一个类型为另一个类的属性.例如:
I have a class which contains a property who's type is another class. For example:
public class Outer
{
public string SomeStringProperty { get; set; }
public Inner SomeClassProperty { get; set; }
}
public class Inner
{
public string InnerProperty1 { get; set; }
public string InnerProperty2 { get; set; }
}
我想将 Outer
类的实例转换为 URL 查询字符串,并包含嵌套的 Inner
类中的属性.
I want to convert an instance of the Outer
class to a URL query string, and include the properties from the nested Inner
class.
例如给定一个Outer
的实例,如:
For example, given an instance of Outer
, such as:
Outer toSerialise = new Outer
{
SomeStringProperty = "MyOuterValue",
SomeClassProperty = new Inner
{
InnerProperty1 = "MyInnerValue1",
InnerProperty2 = "MyInnerValue2"
}
};
我想把它转换成一个字符串:
I want to convert this to a string of:
&SomeStringProperty=MyOuterValue&InnerProperty1=MyInnerValue1&InnerProperty2=MyInnerValue2
&SomeStringProperty=MyOuterValue&InnerProperty1=MyInnerValue1&InnerProperty2=MyInnerValue2
我怎样才能做到这一点?
How can I achieve this?
我找到了类似问题的答案,但它们似乎不支持嵌套类.
I've found answers to similar questions, however they don't seem to support nested classes.
推荐答案
我们在 Oauth2 中回调 url 的客户端状态有同样的问题,因为回调 url 有 & &也是
We had same problem with callback url's client state in Oauth2 because callback urls have ampersand & too
http://.......?param=123¶m2=456&state=?id=1&name=test
我们只是将回调 url 转换为 Base64 编码的字符串并在服务本身解码.
We just converted callback url to Base64 encoded string and decoded at service itself.
http://.......?param=123¶m2=456&state=P2lkPTEmbmFtZT10ZXN0
修复:
- 将您的类实例编码为 json
- 将 json 编码为 base64string
- 将 url 中的 base64string 作为数据参数发送
- 解码 base64 并将 json 映射到您的 api 模型中.
JSON:
{ "menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [
{"value": "New", "onclick": "CreateNewDoc()"},
{"value": "Open", "onclick": "OpenDoc()"},
{"value": "Close", "onclick": "CloseDoc()"}
]
}
}}
Base64:
<代码> eyJtZW51IjogewogICJpZCI6ICJmaWxlIiwKICAidmFsdWUiOiAiRmlsZSIsCiAgInBvcHVwIjogewogICAgIm1lbnVpdGVtIjogWwogICAgICB7InZhbHVlIjogIk5ldyIsICJvbmNsaWNrIjogIkNyZWF0ZU5ld0RvYygpIn0sCiAgICAgIHsidmFsdWUiOiAiT3BlbiIsICJvbmNsaWNrIjogIk9wZW5Eb2MoKSJ9LAogICAgICB7InZhbHVlIjogIkNsb3NlIiwgIm9uY2xpY2siOiAiQ2xvc2VEb2MoKSJ9CiAgICBdCiAgfQp9fQ ==
网址:
<代码>&安培;数据= eyJtZW51IjogewogICJpZCI6ICJmaWxlIiwKICAidmFsdWUiOiAiRmlsZSIsCiAgInBvcHVwIjogewogICAgIm1lbnVpdGVtIjogWwogICAgICB7InZhbHVlIjogIk5ldyIsICJvbmNsaWNrIjogIkNyZWF0ZU5ld0RvYygpIn0sCiAgICAgIHsidmFsdWUiOiAiT3BlbiIsICJvbmNsaWNrIjogIk9wZW5Eb2MoKSJ9LAogICAgICB7InZhbHVlIjogIkNsb3NlIiwgIm9uY2xpY2siOiAiQ2xvc2VEb2MoKSJ9CiAgICBdCiAgfQp9fQ ==
替代:
如果你必须使用这种查询格式,那么你也可以使用委托类型
If you must use this query format then you can also use delegate types
Outer toSerialise = new Outer
{
SomeStringProperty = "MyOuterValue",
SomeClassProperty = new Inner
{
InnerProperty1 = "MyInnerValue1",
InnerProperty2 = "MyInnerValue2"
}
};
var queryObject = new { toSerialise.SomeStringProperty, toSerialise .Inner.InnerProperty1, toSerialise.Inner.InnerProperty2 }
这篇关于将对象序列化为 URL 参数字符串 - 包括嵌套对象的属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!