Ошибка десериализации Json. Неподдерживаемый тип: System.Guid

2

Я работал над проектом API, и получил вопрос ниже,

это Json я прохожу

{
  "MainClass": [
    {
      "Text": ".",
      "Id": {
        "System.Guid": "06073a9c-9cef-4f07-9180-2e54e0fa6416"
      }
    }
  ]
}

Это мои модели С#

public class MainClass {
  public List<SubClass> Subs {get;set;}
}

public class SubClass {
  public string Text {get;set;}
  public Guid Id {get;set;}
}

Когда я передаю вышеупомянутый JSON, я получаю ошибку ниже

{"Message": "Запрос недействителен.", "ModelState": {"MainClass.SubClass [0].Id": ["Ошибка десериализации Json. Неподдерживаемый тип: System.Guid"]}}

Я пробовал ниже Json также,

{
  "MainClass": [
    {
      "Text": ".",
      "Id": "06073a9c-9cef-4f07-9180-2e54e0fa6416"
    }
  ]
}

Как я могу это исправить?

Это происходит, когда я публикую JSON с помощью почтальона. Я вижу, что он попадает в контроллер, но не в действие. Выдает ошибку, сказав, как указано выше.

  • 1
    Я добавил свой ответ ниже с выводом и онлайн-демонстрацией, попробуйте и дайте мне знать :)
Теги:
deserialization

3 ответа

2
Лучший ответ

1) Для вашего первого JSON,

{
  "MainClass": [
    {
      "Text": ".",
      "Id": {
        "System.Guid": "06073a9c-9cef-4f07-9180-2e54e0fa6416"
      }
    }
  ]
}

Вам нужно создать еще одну модель класса для хранения свойства типа Guid,

public class RootClass
{
    public List<MainClass> MainClass { get; set; }
}

public class MainClass
{
    public string Text { get; set; }
    public _Guid Id { get; set; }
}

public class _Guid
{
    [JsonProperty("System.Guid")]
    public Guid Id { get; set; }
}

Использование:

RootClass mainClass = JsonConvert.DeserializeObject<RootClass>(json);

mainClass.MainClass.ForEach(x => Console.WriteLine("Text:\t" + x.Text + "\n" + "Id:\t" + x.Id.Id));

Демо онлайн


2) И для вашего второго JSON,

{
  "MainClass": [
    {
      "Text": ".",
      "Id": "06073a9c-9cef-4f07-9180-2e54e0fa6416"
    }
  ]
}

Вам нужна иерархия классов ниже, чтобы десериализовать ваш JSON правильно,

public class RootClass
{
    public List<MainClass> MainClass { get; set; }
}

public class MainClass
{
    public string Text { get; set; }
    public Guid Id { get; set; }       //<= The type "System.Guid" as it is
}

Использование:

RootClass mainClass = JsonConvert.DeserializeObject<RootClass>(json);

mainClass.MainClass.ForEach(x => Console.WriteLine("Text:\t" + x.Text + "\n" + "Id:\t" + x.Id));    

Демо онлайн


Выход: (для обоих выше JSON)

Изображение 174551

  • 1
    Рад слышать и добро пожаловать :)
3

вам нужны следующие файлы классов

public class Id
{
    [JsonProperty("System.Guid")]
    public string System_Guid { get; set; }
}


public class MainClass
{
    public string Text { get; set; }
    public Id Id { get; set; }
}

public class rootClass
{
    public List<MainClass> MainClass { get; set; }
}
  • 0
    System.Guid не может быть строковой переменной, поэтому его необходимо заменить на _
  • 0
    Спасибо за ввод, но stackoverflow.com/a/39733825/6915387 говорит, что guid будет автоматически отображаться, верно?
2

Я обычно использую генератор JSON, как эти объекты

И вот, результат в том, что

public class Id
{
    public string MyGuid { get; set; }
}

public class MainClass
{
    public string Text { get; set; }
    public Id Id { get; set; }
}

public class RootObject
{
    public List<MainClass> MainClass { get; set; }
}

Вы не можете использовать имя System.Guid в качестве имени свойства.

ВАЖНО: десериализовать объект следующим образом;

RootObject myObject = Newtonsoft.Json.JsonConvert.DeserializeObject<RootObject>(json.Replace("System.Guid","MyGuid"));
  • 0
    System.Guid не может быть именем переменной

Ещё вопросы

Сообщество Overcoder
Наверх
Меню