摘要:我需要通过C#提交一个JSON请求,其中部分负载会根据某些业务规则进行更改。我知道所有可能的结构,但在请求中只能使用正确的结构。
示例1
{
"activity": {
"referenceId": "",
"data": {
"rents": 0.0,
"wages": 0.0
}
}
}
示例2
{
"activity": {
"referenceId": "",
"data": {
"transport": 0.0,
"salaries": 0.0
}
}
}
示例3
{
"activity": {
"referenceId": "",
"data": {
"water": 0.0,
"miscellaneous": 0.0
}
}
}
因此,根据一些业务规则,我必须更改";数据";。这比两个房地产名称要复杂一些,但我认为这个问题的答案就足够了。
我已经像往常一样设置了POCO,但不知道如何让它们在这个要求范围内工作。
我有了创建一个";主";数据对象,以某种方式只传递所需的属性,但我在这一点上感到困惑。
public class Rootobject
{
public Activity activity { get; set; }
}
public class Activity
{
public string referenceId { get; set; }
public Data data { get; set; }
}
public class Data //Inheriting from this master won't work.
{
public float water { get; set; }
public float miscellaneous { get; set; }
public float transport { get; set; }
public float salaries { get; set; }
public float rents { get; set; }
public float wages { get; set; }
}
只需对所有属性使用null属性忽略功能。像这样:
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public float water { get; set; }
此属性从对象中删除空数据。
我已经制作了很多不同的解决方案来处理这样的JSON,但从长远来看,最好的是简单的Dictionary:
class Root
{
public Activity Activity { get; set; }
}
class Activity
{
public string ReferenceId { get; set; }
public Dictionary<string, float> Data { get; set; }
}
然后,您可以将这些对象映射到您想要的任何对象。
您还可以阅读有关转换器和极化反序列化的内容,但这并不容易。您必须手动检测鉴别器(某个类型中存在的唯一字段(,然后。。。不过,在转换器中手动执行。