我正在针对返回JSON数据的第三方API进行编程,但是格式可能有点奇怪。某些属性可以是一个对象(包含一个Id属性),也可以是一个字符串(它是该对象的ID)。例如,以下两个都是有效的:
{ ChildObject: 'childobjectkey1' }
和
{ ChildObject: { Id: 'childobjectkey1', // (other properties) } }
我正在尝试使用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; } }
但是,JsonProperty在具有相同PropertyName的两个属性上设置属性会导致异常:
JsonProperty
Newtonsoft.Json.JsonSerializationException:’.....’上已经存在一个名称为’ChildObject’的成员。使用JsonPropertyAttribute指定另一个名称。
我相当确定如果可以克服此障碍,JsonConverter方法将可以工作- 我怀疑错误在那里,因为JsonProperty属性用于序列化和反序列化。在这种情况下,我对序列化此类没有兴趣-它将仅用作反序列化的目标。
我无法控制远端(这是第三方API),但是我希望能够实现此序列化。我不在乎它是在使用我已经开始使用的方法,还是我尚未想到的方法。
尝试以下操作(如果您将在代码中使用它,请进行彻底的验证来扩展它):
public class MyObject { public ChildObject MyChildObject; public string MyChildObjectId; [JsonProperty("ChildObject")] public object ChildObject { get { return MyChildObject; } set { if (value is JObject) { MyChildObject = ((JToken)value).ToObject<ChildObject>(); MyChildObjectId = MyChildObject.Id; } else { MyChildObjectId = value.ToString(); MyChildObject = null; } } } }