一尘不染

将JSON反序列化为多个属性

json

我正在针对返回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的两个属性上设置属性会导致异常:

Newtonsoft.Json.JsonSerializationException:’.....’上已经存在一个名称为’ChildObject’的成员。使用JsonPropertyAttribute指定另一个名称。

我相当确定如果可以克服此障碍,JsonConverter方法将可以工作-
我怀疑错误在那里,因为JsonProperty属性用于序列化和反序列化。在这种情况下,我对序列化此类没有兴趣-它将仅用作反序列化的目标。

我无法控制远端(这是第三方API),但是我希望能够实现此序列化。我不在乎它是在使用我已经开始使用的方法,还是我尚未想到的方法。


阅读 269

收藏
2020-07-27

共1个答案

一尘不染

尝试以下操作(如果您将在代码中使用它,请进行彻底的验证来扩展它):

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;
            }
        }
    }
}
2020-07-27