Я получаю «тип является интерфейсом, не может быть инстанциирован» Ошибка десериализации с Json.NET хотя я указать тип на объект Я пытаюсь десериализацииJson.net десериализации массив интерфейсов
private static JsonSerializerSettings settings = new JsonSerializerSettings {
TypeNameHandling = TypeNameHandling.Auto };
/// <summary>
/// Returns an object created from the jObject and placed in a stub object
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="jObj"></param>
/// <returns></returns>
public static T FromJObject<T>(JToken jObj)
{
if (jObj == null)
{
jObj = new JObject();
}
if (jObj is JValue)
{
return (T)((JValue)jObj).Value;
}
else
{
return (T)JsonConvert.DeserializeObject<T>(jObj.ToString(), settings);
}
}
это jObj
{
"Id": 2,
"Name": "Name",
"JsonMapEnum": 0,
"Validations": [
{
"Id": 1,
"$type": "JsonMap.Default.JValidation, JsonMap"
}
],
"JSType": 3,
"SubJsonMapEnum": -1,
"$type": "JsonMap.Default.JAttribute, JsonMap"
}
Это ошибка
Could not create an instance of type JsonMap.Interfaces.IValidation. Type is an interface or abstract class and cannot be instantated. Path 'Validations[0].Id'
Похоже, он пытается превратить Id в объект Validation. Зачем?
этих интерфейсы, реализованных моих типами
public interface IJsonMap
{
long Id { get; set; }
String Name { get; set; }
LazyEnum JsonMapEnum { get; set; }
}
public interface IAttribute : IJsonMap
{
IEnumerable<IValidation> Validations { get; set; }
LazyEnum JSType { get; set; }
LazyEnum SubJsonMapEnum { get; set; }
}
public interface IValidation : IJsonMap
{
IEnumerable<IArgument> Arguments { get; set; }
}
это на вызов
FromJObject<JAttribute>(CreationJObj)
JAttribute реализует IAttribute
'По-видимому,« $ type »должно быть первым свойством». Нет необходимости в этом. Предположим, что вы являетесь автором сериализатора, вы бы использовали 'dict [" $ type "]' или 'list [0]' – I4V
Хорошо, но у вас есть метод, который реорганизует ваши свойства, мне пришлось создать утилиту для именно по этой причине, и это никоим образом не было очевидным, что это было требованием. При работе с браузерами и созданием json на стороне клиента это не похоже на случай использования в левом поле. – DrSammyD
Не поймите меня неправильно, я бесконечно благодарен JamesNK за создание инструмента, все, что я говорю, это то, что это неожиданное поведение, извините за то, что я разочаровался в том, что я разочарован. – DrSammyD