Я программирую против стороннего API, который возвращает данные JSON, но формат может быть немного странным. Некоторые свойства могут быть либо объектом (который содержит свойство 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
для двух свойств с тем же именем свойства вызывает исключение:
Newtonsoft.Json.JsonSerializationException: член с именем "ChildObject" уже существует на ".....". Используйте JsonPropertyAttribute, чтобы указать другое имя.
Я уверен, что подход JsonConverter будет работать, если я смогу преодолеть это препятствие. Я подозреваю, что ошибка существует, потому что атрибут JsonProperty используется для сериализации, а также для десериализации. В этом случае я не заинтересован в сериализации этого класса - он будет использоваться только как цель для десериализации.
У меня нет контроля над удаленным концом (это сторонний API), но я хотел бы получить эту сериализацию. Я не против, если он использует подход, который я начал, или тот, о котором я еще не думал.
Этот вопрос также связан, но ответов не было.