Я программирую против стороннего API, который возвращает данные JSON, но формат может быть немного странным. Некоторые свойства могут быть либо объектом (который содержит свойство Id), либо строкой (которая является идентификатором объекта). Например, оба следующих справедливы:Deserialize JSON для нескольких свойств
{
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), но я хотел бы иметь возможность добиться этой сериализации. Я не против, если он использует подход, который я начал, или тот, о котором я еще не думал.
This question также имеет отношение, но ответов не было.
Я думаю, что конвертер должен быть для целого объекта, а не для отдельного поля ... (формат BTW кажется довольно разумным для сложного графика сущностей) –
В надежде избежать пользовательского конвертера для всего объекта, так как существует несколько экземпляров это, и некоторые типы имеют более одного свойства, подобного этому. – Richard