Ответ 1
Это можно решить, создав JsonConverter
для вашего класса SupplierData
. Вот как выглядит конвертер:
class SupplierDataConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(SupplierData));
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JToken token = JToken.Load(reader);
if (token.Type == JTokenType.Object)
{
return token.ToObject<SupplierData>();
}
return null;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
serializer.Serialize(writer, value);
}
}
Чтобы использовать его, все, что вам нужно сделать, это добавить атрибут [JsonConverter]
к свойству Supplier
в свой класс Data
следующим образом:
public class Data
{
[JsonProperty("supplier")]
[JsonConverter(typeof(SupplierDataConverter))]
public SupplierData Supplier { get; set; }
}
Ниже приведена демонстрация преобразователя в действии. Обратите внимание, что в demo предполагается, что у вас есть какой-то содержащий объект для свойства Data
, поскольку JSON в вашем вопросе не может стоять сам по себе. Для этой цели я определил класс RootObject
:
public class RootObject
{
[JsonProperty("data")]
public Data Data { get; set; }
}
Ниже приведен фактический демо-код:
class Program
{
static void Main(string[] args)
{
string json = @"
{
""data"":
{
""supplier"":
{
""id"": 15,
""name"": ""TheOne""
}
}
}";
Console.WriteLine("--- first run ---");
RootObject obj = JsonConvert.DeserializeObject<RootObject>(json);
DumpSupplier(obj.Data.Supplier);
json = @"
{
""data"":
{
""supplier"": false
}
}";
Console.WriteLine("--- second run ---");
obj = JsonConvert.DeserializeObject<RootObject>(json);
DumpSupplier(obj.Data.Supplier);
}
static void DumpSupplier(SupplierData supplier)
{
if (supplier != null)
{
Console.WriteLine("Id: " + supplier.Id);
Console.WriteLine("Name: " + supplier.Name);
}
else
{
Console.WriteLine("(null)");
}
Console.WriteLine();
}
}
И вот результат из вышеперечисленного:
--- first run ---
Id: 15
Name: TheOne
--- second run ---
(null)