Не удалось найти конструктор

Скриншот ошибки У меня есть файл json, который содержит некоторые данные, и я хочу его проанализировать, но каждый раз, когда я хочу десериализовать объект, он выдает мне эту ошибку «Невозможно найти конструктор. Класс должен иметь конструктор по умолчанию, один конструктор с аргументами или конструктор, отмеченный конструктором json, я не знаю, что делать, потому что я не работал с json до того, как впервые работаю с json. вот мой json:

{
   "Addition":
   {
       "Easy": [

                "New York Bulls",
                "Los Angeles Kings",
                "Golden State Warriros",
                "Huston Rocket"
            ],
      "Medium":[
                "New York Bulls",
                "Los Angeles Kings",
                "Golden State Warriros",
                "Huston Rocket"
      ],
       "Difficult": [
               "New York Bulls",
               "Los Angeles Kings",
               "Golden State Warriros",
               "Huston Rocket"
      ] 
   }
}

вот мой модельный класс

public class Addition
{

     public List<string> Easy { get; set; }
        public List<string> Medium { get; set; }
        public List<string> Difficult { get; set; }

    public Addition() { }

}

вот моя функция, в которой я Deserialize объект

private void ReadJson()
    {
        var assembly = typeof(WordProblemsScreen).GetTypeInfo().Assembly;
        Stream stream = 
assembly.GetManifestResourceStream("MathRandomizer.demo.json");

        using (var reader = new System.IO.StreamReader(stream))
        {

            string json = reader.ReadToEnd();

            JObject jObject = JObject.Parse(json);
            JToken jUser = jObject["Addition"];


            var addition = JsonConvert.DeserializeObject<Addition>(json);




        }
    }

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

HimBromBeere 12.04.2019 08:53

@HimBromBeere, я пробовал то, что вы говорите, но ошибка все та же.

Masti Broz Top 12.04.2019 08:55

@HimBromBeere все та же ошибка

Masti Broz Top 12.04.2019 08:59

Я думаю, у вас есть еще один Addition класс. Нажмите в середине <Addition>, а затем нажмите [F12]. Посмотрите, куда это вас приведет.

Henk Holterman 12.04.2019 09:05
var addition = JsonConvert.DeserializeObject<Addition>(json); <-- вы пытаетесь десериализовать свой JSON в неправильный объект. Вам нужен корневой объект.
Llama 12.04.2019 09:06

@HenkHolterman нет, я использую правильный класс, он ведет меня к классу, который я определил в вопросе выше.

Masti Broz Top 12.04.2019 09:08

@Джон, не могли бы вы объяснить немного больше или написать какой-нибудь правильный код

Masti Broz Top 12.04.2019 09:09

Ваш класс не соответствует json :-)

Laurent Lequenne 12.04.2019 09:10

@Masti Ваши классы C# должны соответствовать вашим объектам JSON. Первый { в вашем JSON — это объект, в который вам нужно десериализоваться. Корневой объект вашего JSON содержит ваш класс Additions — вы, кажется, знаете об этом из строки JToken jUser = jObject["Addition"];.

Llama 12.04.2019 09:11

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

Henk Holterman 12.04.2019 09:11

Возможный дубликат Десериализовать JSON в классы C#

Llama 12.04.2019 09:11

Я отменил ваше редактирование, потому что оно делает недействительными уже предоставленные ответы.

Llama 12.04.2019 09:28

но ответ не работает для меня человек

Masti Broz Top 12.04.2019 09:28

все та же ошибка

Masti Broz Top 12.04.2019 09:29
Меня устраивает, как только я изменю ваш вызов десериализации, чтобы отразить, что RootObject вложен в Addition (по какой-то причине?). Как я уже говорил: единственный логический вывод сейчас состоит в том, что ваш JSON отличается. Не зная, что на самом деле представляет собой ваш JSON, мы не сможем вам помочь. Я напечатал JSON в связанной скрипке - отсутствие новых строк не имеет значения. Сравните его с вашим реальным JSON, также выполнив Console.WriteLine(json) в своем собственном коде.
Llama 12.04.2019 09:32

Я также не верю, что вы получаете то же самое «Невозможно найти конструктор». ошибка.

Llama 12.04.2019 09:34

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

Masti Broz Top 12.04.2019 09:36

Очистите и перестройте свой проект.

Llama 12.04.2019 09:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
18
2 294
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вставьте свой Json как C#, используя Редактировать - Специальная вставка - Вставить JSON как С#, или используйте один из онлайн-конвертеров JSON в C#, и вы увидите проблему:

public class Addition
{
    public List<string> Easy { get; set; }
    public List<string> Medium { get; set; }
    public List<string> Difficult { get; set; }
}

public class RootObject
{ 
   public Addition Addition { get; set; }
}

@Masti Десериализовать в RootObject.

Llama 12.04.2019 09:26
Ответ принят как подходящий

Вам нужен корневой объект:

public class RootObject
{
    public Addition Addition { get; set; }
}

var result = JsonConvert.DeserializeObject<RootObject>(json);
Console.WriteLine(result.Addition.Easy.First());

Попробуйте онлайн

И даже работает с вашим старым кодом с атрибутом [JsonConstructor].

Проще говоря: ваши классы C# должны соответствовать JSON, который вы хотите десериализовать.

Представьте, что у вас есть следующий JSON:

{
    "person": {
        "name": "John"
    }
}

Вы не можем просто десериализуете его в следующий класс:

public class Person
{
    public string Name { get; set; }
}

Почему? Потому что объект «человек» не является вашим корневой объект. Приведенный выше класс, сериализованный как JSON, просто выглядит так:

{
    "name": "John"
}

Итак, чтобы десериализовать первый пример выше, нам нужен корневой объект:

public class RootObject
{
    public Person Person { get; set; }
}

public class Person
{
    public string Name { get; set; }
}

И теперь мы можем десериализовать этот JSON (тот, который содержит ключ «человек») в RootObject

JSON действительно прост — все должно совпадать.

я получаю ту же ошибку, это то, что я сделал, я создал новое имя класса RootObject и поместил приведенный выше код в этот класс, затем я добавил последнюю строку в свою функцию readjson, но все равно та же ошибка

Masti Broz Top 12.04.2019 09:21

Хорошо, почему мы не получаем ошибку в двух примерах скриптов? Вы делаете что-то по-другому.

Llama 12.04.2019 09:22

у меня есть отдельный файл json, из которого я хочу прочитать значения, но вы пишете json в классе

Masti Broz Top 12.04.2019 09:24

я скопировал и вставил тот же ваш код, но все та же ошибка

Masti Broz Top 12.04.2019 12:28

@Masti, пожалуйста, загрузите образец, который воспроизводит проблему, на GitHub, и я посмотрю.

Llama 12.04.2019 12:49

эй, Джон, я проверил ваш код в новом отдельном проекте и он работает, но когда я использую ваш код в своем существующем проекте, он дает мне ту же ошибку, даже если я создаю новую страницу контента, но все еще та же проблема в моем существующем проекте

Masti Broz Top 15.04.2019 08:57

@Masti Проверьте версию JSON.NET, которую вы используете. Иногда между версиями встречаются незначительные расхождения. Я думаю, что лучше использовать последнюю версию. Также убедитесь, что у вас нет двух классов (отличных от двух файлов) с одинаковым именем, но в разных пространствах имен. Возможно, вы десериализуете не тот класс.

Llama 15.04.2019 08:59

версия 12.0.1 и у меня только один класс

Masti Broz Top 15.04.2019 09:05

@Masti Боюсь, без понятия. В вашем проекте есть что-то странное.

Llama 15.04.2019 09:06

я также чувствую себя странно, потому что один и тот же код работает на 100% правильно в отдельном проекте, но не в моем проекте, даже сейчас у меня нет повторяющихся классов и т. д. и т. д.

Masti Broz Top 15.04.2019 09:09

Дважды проверьте это, нажав «Добавить» в коде десериализации, а затем нажмите F12 на клавиатуре. Это приведет вас к определению. Это тот класс, который вы ожидаете увидеть?

Llama 15.04.2019 09:10

проверьте мой вопрос еще раз, я добавил скриншот ошибки

Masti Broz Top 15.04.2019 09:15

Это очень странно. Мне никогда не приходилось явно объявлять конструктор. Попробуйте добавить public RootObject() { } в качестве конструктора без параметров по умолчанию. Это не совсем решение, если оно действительно работает, поскольку JSON.NET не требует, чтобы вы явно объявляли его.

Llama 15.04.2019 09:17

такая же проблема, братан, кстати, этот код работает в отдельном проекте

Masti Broz Top 15.04.2019 09:20

Можете ли вы попробовать понизить версию JSON.NET на одну основную версию на случай, если это ошибка.

Llama 15.04.2019 09:20

но братан, тогда почему он отлично работает в отдельном проекте, как версии одинаковые в обоих проектах 12.0.1

Masti Broz Top 15.04.2019 09:23

Хорошая точка зрения. Честно говоря, я понятия не имею на этом этапе. Не видя весь неудачный проект и не имея возможности его протестировать, я не могу ничего посоветовать.

Llama 15.04.2019 09:23
Связанный?
Llama 15.04.2019 09:24

я понизил, но та же проблема

Masti Broz Top 15.04.2019 09:29

спасибо, чувак, я решаю это, зайдя в параметры Android и изменив ссылку только на сборки sdk

Masti Broz Top 15.04.2019 09:36

Исключение возникает из-за того, что вы пытаетесь преобразовать содержимое JSON в неправильный объект. Поскольку ваш JSON содержит атрибут «Дополнение» вверху, он считается свойством некоторого родительского класса. Итак, он ожидает такой класс:

namespace JsonStuff
{
    public class SomeParentClass
    {
        public Addition AdditionObject { get; set; }

        public SomeParentClass()
        {

        }
    }
}

Если вы попробуете сериализовать объект из типа «Дополнение» другим способом и посмотрите на исходящую строку json, вы увидите разницу:

var filledObject = new Addition()
{
    Easy = new List<string>()
    {
        "New York Bulls",
        "Los Angeles Kings",
        "Golden State Warriros",
        "Huston Rocket"
    },
    Medium = new List<string>()
    {
        "New York Bulls",
        "Los Angeles Kings",
        "Golden State Warriros",
        "Huston Rocket"
    },
    Difficult = new List<string>()
    {
        "New York Bulls",
        "Los Angeles Kings",
        "Golden State Warriros",
        "Huston Rocket"
    }
};

var serializedObject = JsonConvert.SerializeObject(filledObject);

Результат будет:

{
    "Easy":
    [
        "New York Bulls",
        "Los Angeles Kings",
        "Golden State Warriros",
        "Huston Rocket"
    ],
    "Medium":
    [
        "New York Bulls",
        "Los Angeles Kings",
        "Golden State Warriros",
        "Huston Rocket"
    ],
    "Difficult":
    [
        "New York Bulls",
        "Los Angeles Kings",
        "Golden State Warriros",
        "Huston Rocket"
    ]
}

и там вы видите разницу: сверху нет свойства «Дополнение».

Вы можете либо создать родительский класс, подобный тому, который я разместил сверху, либо изменить свой файл json на формат, подобный примеру внизу.

rekcul 12.04.2019 09:27

Другие вопросы по теме