【发布时间】:2020-01-16 05:02:57
【问题描述】:
我需要使用输入参数是动态对象的方法,但我通过接收到的 JSON 提供对象
动态生成器:
public static dynamic PayChargeObject()
{
var body = new
{
payment = new
{
banking_billet = new
{
customer = new
{
name = "",
email = "",
cpf = "",
birth = "",
phone_number = "",
address = new
{
street = "",
number = "",
neighborhood = "",
zipcode = "",
city = "",
complement = "",
state = "",
},
juridical_person = new
{
corporate_name = "",
cnpj = "",
}
},
expire_at = "",
discount = new
{
type = "",
value = 0
},
conditional_discount = new
{
type = "",
value = 0,
until_date = ""
},
message = ""
}
}
};
return body;
}
我的 JSON 数据:
{
"payment": {
"banking_billet": {
"customer": {
"name": "person name",
"email": "personnamez@gerencianet.com.br",
"cpf": "94271564656",
"birth": "1977-01-15",
"phone_number": "41991234567"
},
"expire_at": "2019-12-12"
}
}
注意json不会总是把对象中的所有可用字段都填满,但是我需要消费的方法不接受字段中的空值,而我的问题是这样的,在动态对象中反序列化JSON时,字段JSON 中未使用的在动态对象中创建为 null
JSON 转换和方法调用:
var obj = JsonConvert.DeserializeAnonymousType(MyJSON, PayChargeObject())
dynamicMethod.PayCharge(obj);
Dynamic Object with null fields on Debug
我该如何解决这个问题?
【问题讨论】:
-
返回的不是动态对象,而是匿名类型对象。如果你想返回一个真正的动态对象(一个没有允许添加任意属性的固定模式的对象),你可以反序列化为
ExpandoObject。 -
与真正的dynamic objects 不同,匿名类型对象具有固定模式。这意味着 JSON 中缺少的属性必须存在于返回的对象中——具有一些默认值。如果您不想使用
null,您希望为缺少的属性设置什么值do?传入的匿名类型对象中的值是多少? -
@dbc 你说得对,我通过替换块来管理 var obj = JsonConvert.DeserializeAnonymousType(MyJSON, PayChargeObject()) dynamicMethod.PayCharge(obj);使用 dynamicMethod.PayCharge(JObject.Parse(MyJSON));
-
好吧,
JObject具有额外的 JSON 特定属性,因此您可能想改用ExpandoObject。但如果JObject有效,那就是胜利。要我回答吗?