我正在针对返回JSON数据的第三方API进行编程,但格式可能有点奇怪。某些属性可以是一个对象(包含Id属性),也可以是一个字符串(对象的Id)。例如,以下两种情况均有效:
{
ChildObject: 'childobjectkey1'
}
和
{
ChildObject: {
Id: 'childobjectkey1',
// (other properties)
}
}
我试图使用www.example.com将其转换JSON.net为一个强类型类,但到目前为止还没有太多的运气。我最好的想法是将其序列化为两个属性,一个是字符串,另一个是对象,并为每个属性使用自定义的JsonConverter来允许变量行为:
public abstract class BaseEntity
{
public string Id { get; set; }
}
public class ChildObject : BaseEntity { }
public class MyObject
{
[JsonProperty("ChildObject")]
[JsonConverter(typeof(MyCustomIdConverter))]
public string ChildObjectId { get; set; }
[JsonProperty("ChildObject")]
[JsonConverter(typeof(MyCustomObjectConverter))]
public ChildObject ChildObject { get; set; }
}
但是,在具有相同PropertyName的两个属性上设置JsonProperty
属性会导致异常:
Newtonsoft.Json.JsonSerializationException:“.....”上已存在名为“ChildObject”的成员。使用JsonPropertyAttribute指定另一个名称。
我相当肯定,如果我能克服这个障碍,JsonConverter方法将起作用-我怀疑错误是存在的,因为JsonProperty属性用于序列化和非序列化。在这种情况下,我对序列化这个类没有兴趣--它只会被用作序列化的目标。
我无法控制远程终端(它是第三方API),但我希望能够实现这一点。我不介意它使用我已经开始使用的方法,或者我还没有想到的方法。
This question也是相关的,但没有答案。
3条答案
按热度按时间lnxxn5zx1#
试试这个(如果你要在代码中使用它,用一些彻底的验证来扩展它):
eh57zj3b2#
与其为每个字段创建两个单独的转换器,不如为“main”属性创建一个转换器,并将另一个转换器链接到它。
ChildObjectId
是从ChildObject
导出的。现在转换
ChildObject
可能是一个挑战。对象有两种可能的表示形式:字符串或对象。确定您拥有的表示形式并执行转换。ogsagwnx3#
在这种情况下我会这么做。
ChildObject
JsonConverter
,它可以检查JSON,并且:在示例化之后,如果JSON中有一个
ChildObject
属性(带有ID或完整的对象值),则可以保证有一个ChildObject
示例,并且可以从中获取其ID;否则,如果JSON中没有ChildObject
属性,则父类中的ChildObject
属性将为null。下面是一个完整的工作示例来演示。在本例中,我修改了父类,使其包含
ChildObject
的三个独立示例,以显示JSON中的不同可能性(仅字符串ID、完整对象和不存在)。它们都使用相同的转换器。我还向ChildObject
类添加了一个Name
属性和一个IsFullyPopulated
属性。以下是DTO类:
下面是转换器:
下面是演示转换器操作的测试程序:
下面是上面的输出: