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

Снимок экрана с ошибкой у меня есть файл 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);




        }
    }

person Masti Broz Top    schedule 12.04.2019    source источник
comment
Я думаю, вам даже не нужен этот конструктор, и вместо этого вы можете полагаться на конструктор по умолчанию. JsonConvert будет использовать его, если не указан другой, и установит свойства соответствующим образом.   -  person HimBromBeere    schedule 12.04.2019
comment
@HimBromBeere, я пробовал то, что вы говорите, но ошибка все та же.   -  person Masti Broz Top    schedule 12.04.2019
comment
@HimBromBeere все та же ошибка   -  person Masti Broz Top    schedule 12.04.2019
comment
Я думаю, у вас есть еще один Addition класс. Нажмите в середине <Addition>, а затем нажмите [F12]. Посмотрите, куда это вас приведет.   -  person Henk Holterman    schedule 12.04.2019
comment
var addition = JsonConvert.DeserializeObject<Addition>(json); ‹-- вы пытаетесь десериализовать свой JSON в неправильный объект. Вам нужен корневой объект.   -  person Llama    schedule 12.04.2019
comment
@HenkHolterman нет, я использую правильный класс, он ведет меня к классу, который я определил в вопросе выше.   -  person Masti Broz Top    schedule 12.04.2019
comment
@Джон, не могли бы вы объяснить немного больше или написать какой-нибудь правильный код   -  person Masti Broz Top    schedule 12.04.2019
comment
Ваш класс не соответствует json :-)   -  person Laurent Lequenne    schedule 12.04.2019
comment
@Masti Ваши классы C# должны соответствовать вашим объектам JSON. Первый { в вашем JSON — это объект, в который вам нужно десериализоваться. Корневой объект вашего JSON содержит ваш класс Additions - вы, кажется, знаете об этом из строки JToken jUser = jObject["Addition"];.   -  person Llama    schedule 12.04.2019
comment
Всегда публикуйте точные сообщения об ошибках с номерами строк и трассировкой стека, если это возможно.   -  person Henk Holterman    schedule 12.04.2019
comment
Возможный дубликат Десериализовать JSON в классы C#   -  person Llama    schedule 12.04.2019
comment
Я отменил ваше редактирование, потому что оно делает недействительными уже предоставленные ответы.   -  person Llama    schedule 12.04.2019
comment
но ответ не работает для меня человек   -  person Masti Broz Top    schedule 12.04.2019
comment
все та же ошибка   -  person Masti Broz Top    schedule 12.04.2019
comment
Это работает для меня, когда я настраиваю ваш вызов десериализации, чтобы отразить, что RootObject вложен в Addition (по какой-то причине?) . Как я уже говорил: единственный логический вывод сейчас состоит в том, что ваш JSON отличается. Не зная, что на самом деле представляет собой ваш JSON, мы не сможем вам помочь. Я напечатал JSON в связанной скрипке - отсутствие новых строк не имеет значения. Сравните его с вашим фактическим JSON, также выполнив Console.WriteLine(json) в своем собственном коде.   -  person Llama    schedule 12.04.2019
comment
Я также не верю, что вы получаете то же самое Невозможно найти конструктор. ошибка.   -  person Llama    schedule 12.04.2019
comment
я все еще получаю эту ошибку, можем ли мы сделать приватный чат, чтобы я мог показать вам, что я все еще получаю эту ошибку   -  person Masti Broz Top    schedule 12.04.2019
comment
Очистите и перестройте свой проект.   -  person Llama    schedule 12.04.2019


Ответы (3)


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

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; }
}

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

{
    "name": "John"
}

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

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

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

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

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

person Llama    schedule 12.04.2019
comment
я получаю ту же ошибку, это то, что я сделал, я создал новое имя класса RootObject и поместил приведенный выше код в этот класс, затем я добавил последнюю строку в свою функцию readjson, но все та же ошибка - person Masti Broz Top; 12.04.2019
comment
Хорошо, почему мы не получаем ошибку в двух примерах скриптов? Вы делаете что-то по-другому. - person Llama; 12.04.2019
comment
у меня есть отдельный файл json, из которого я хочу прочитать значения, но вы пишете json в классе - person Masti Broz Top; 12.04.2019
comment
я скопировал и вставил тот же ваш код, но все та же ошибка - person Masti Broz Top; 12.04.2019
comment
@Masti, пожалуйста, загрузите образец, который воспроизводит проблему, на GitHub, и я посмотрю. - person Llama; 12.04.2019
comment
эй, Джон, я проверил ваш код в новом отдельном проекте и он работает, но когда я использую ваш код в своем существующем проекте, он дает мне ту же ошибку, даже если я создаю новую страницу контента, но все еще та же проблема в моем существующем проекте - person Masti Broz Top; 15.04.2019
comment
@Masti Проверьте версию JSON.NET, которую вы используете. Иногда между версиями встречаются незначительные расхождения. Я думаю, что лучше использовать последнюю версию. Также убедитесь, что у вас нет двух классов (отличных от двух файлов) с одинаковым именем, но в разных пространствах имен. Возможно, вы десериализуете не тот класс. - person Llama; 15.04.2019
comment
версия 12.0.1 и у меня только один класс - person Masti Broz Top; 15.04.2019
comment
@Masti Боюсь, без понятия. В вашем проекте есть что-то странное. - person Llama; 15.04.2019
comment
я также чувствую себя странно, потому что один и тот же код работает на 100% правильно в отдельном проекте, но не в моем проекте, даже сейчас у меня нет повторяющихся классов и т. д. и т. д. - person Masti Broz Top; 15.04.2019
comment
Дважды проверьте это, нажав «Добавить» в коде десериализации, а затем нажмите F12 на клавиатуре. Это приведет вас к определению. Это тот класс, который вы ожидаете увидеть? - person Llama; 15.04.2019
comment
проверьте мой вопрос еще раз, я добавил скриншот ошибки - person Masti Broz Top; 15.04.2019
comment
Это очень странно. Мне никогда не приходилось явно объявлять конструктор. Попробуйте добавить public RootObject() { } в качестве конструктора без параметров по умолчанию. Это не совсем решение, если оно действительно работает, поскольку JSON.NET не требует, чтобы вы явно объявляли его. - person Llama; 15.04.2019
comment
такая же проблема, братан, кстати, этот код работает в отдельном проекте - person Masti Broz Top; 15.04.2019
comment
Можете ли вы попробовать понизить версию JSON.NET на одну основную версию на случай, если это ошибка. - person Llama; 15.04.2019
comment
но братан, тогда почему он отлично работает в отдельном проекте, как версии одинаковые в обоих проектах 12.0.1 - person Masti Broz Top; 15.04.2019
comment
Хорошая точка зрения. Честно говоря, я понятия не имею на этом этапе. Не видя весь неудачный проект и не имея возможности его протестировать, я не могу ничего посоветовать. - person Llama; 15.04.2019
comment
Связано? - person Llama; 15.04.2019
comment
я понизил, но та же проблема - person Masti Broz Top; 15.04.2019
comment
спасибо, чувак, я решаю это, зайдя в параметры Android и изменив ссылку только на сборки sdk - person Masti Broz Top; 15.04.2019

Вставьте свой Json как C#, используя Edit — Paste Special — Paste JSON as C#, или воспользуйтесь одним из онлайн-конвертеров 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; }
}
person Ian Mercer    schedule 12.04.2019
comment
@Masti Десериализовать в RootObject. - person Llama; 12.04.2019

Исключение возникает из-за того, что вы пытаетесь преобразовать содержимое 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"
    ]
}

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

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