Ответ 1
Нет, это невозможно.
Посмотрим на документацию Json.NET. В частности, страница справки о JsonPropertyAttribute классе.
Цитата:
"Указывает JsonSerializer всегда сериализовать член с указанным именем.
Он объявлен в пространстве имен Newtonsoft.Json. Нам нужно определить, как это объявлено. Давайте взглянем на исходный код Json.NET на CodePlex:
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property |
AttributeTargets.Parameter, AllowMultiple = false)]
public sealed class JsonPropertyAttribute : Attribute
{
//...
}
Угадайте, что отвечает на вопрос. Свойству AllowMultiple атрибута присваивается значение false. Таким образом, вы не можете украсить свойство, поле или параметр более одного раза этим атрибутом.
Даже если бы вы могли ожидать, что Json.net выяснит, какой атрибут использовать? Я бы создал типы для Twitter и Facebook отдельно, в которые вы можете десериализовать полученные данные JSON.
Итак:
Twitter -> JSON -> Twitter specific types
Facebook -> JSON -> Facebook spefic types
Затем создайте абстракцию, используемую вашим приложением, вместо прямого обращения к этим типам. Они просто принадлежат к реализации определенных социальных сетей.
Twitter/Facebook/... speficic types → Ваши типы
Если вы пытаетесь десериализовать данные в своих "общих типах", вы просто будете продолжать бороться, потому что они не выравнивают 100% с полученными данными, и вы можете столкнуться с некоторыми напуганными, поддерживать логику десериализации.
Другой вариант - создать собственный конвертер Json.NET.
Просто создайте конвертер для Twitter и Facebook, а при десериализации данных JSON просто укажите, какой конвертер вы хотите использовать.
- TwitterConverter
- FacebookConverter
например:.
MySocialType myType = JsonConvert.DeserializeObject<Mapped>(json,
new TwitterConverter());
В любом случае я постараюсь избежать загрязнения типов вашего класса самой логикой десериализации.