Скриншот ошибки У меня есть файл 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);
}
}
@HimBromBeere, я пробовал то, что вы говорите, но ошибка все та же.
@HimBromBeere все та же ошибка
Я думаю, у вас есть еще один Addition класс. Нажмите в середине <Addition>, а затем нажмите [F12]. Посмотрите, куда это вас приведет.
var addition = JsonConvert.DeserializeObject<Addition>(json); <-- вы пытаетесь десериализовать свой JSON в неправильный объект. Вам нужен корневой объект.
@HenkHolterman нет, я использую правильный класс, он ведет меня к классу, который я определил в вопросе выше.
@Джон, не могли бы вы объяснить немного больше или написать какой-нибудь правильный код
Ваш класс не соответствует json :-)
@Masti Ваши классы C# должны соответствовать вашим объектам JSON. Первый { в вашем JSON — это объект, в который вам нужно десериализоваться. Корневой объект вашего JSON содержит ваш класс Additions — вы, кажется, знаете об этом из строки JToken jUser = jObject["Addition"];.
Всегда публикуйте точные сообщения об ошибках с номерами строк и трассировкой стека, если это возможно.
Возможный дубликат Десериализовать JSON в классы C#
Я отменил ваше редактирование, потому что оно делает недействительными уже предоставленные ответы.
но ответ не работает для меня человек
все та же ошибка
RootObject вложен в Addition (по какой-то причине?). Как я уже говорил: единственный логический вывод сейчас состоит в том, что ваш JSON отличается. Не зная, что на самом деле представляет собой ваш JSON, мы не сможем вам помочь. Я напечатал JSON в связанной скрипке - отсутствие новых строк не имеет значения. Сравните его с вашим реальным JSON, также выполнив Console.WriteLine(json) в своем собственном коде.
Я также не верю, что вы получаете то же самое «Невозможно найти конструктор». ошибка.
я все еще получаю эту ошибку, можем ли мы сделать приватный чат, чтобы я мог показать вам, что я все еще получаю эту ошибку
Очистите и перестройте свой проект.





Вставьте свой 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.
Вам нужен корневой объект:
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, но все равно та же ошибка
Хорошо, почему мы не получаем ошибку в двух примерах скриптов? Вы делаете что-то по-другому.
у меня есть отдельный файл json, из которого я хочу прочитать значения, но вы пишете json в классе
я скопировал и вставил тот же ваш код, но все та же ошибка
@Masti, пожалуйста, загрузите образец, который воспроизводит проблему, на GitHub, и я посмотрю.
эй, Джон, я проверил ваш код в новом отдельном проекте и он работает, но когда я использую ваш код в своем существующем проекте, он дает мне ту же ошибку, даже если я создаю новую страницу контента, но все еще та же проблема в моем существующем проекте
@Masti Проверьте версию JSON.NET, которую вы используете. Иногда между версиями встречаются незначительные расхождения. Я думаю, что лучше использовать последнюю версию. Также убедитесь, что у вас нет двух классов (отличных от двух файлов) с одинаковым именем, но в разных пространствах имен. Возможно, вы десериализуете не тот класс.
версия 12.0.1 и у меня только один класс
@Masti Боюсь, без понятия. В вашем проекте есть что-то странное.
я также чувствую себя странно, потому что один и тот же код работает на 100% правильно в отдельном проекте, но не в моем проекте, даже сейчас у меня нет повторяющихся классов и т. д. и т. д.
Дважды проверьте это, нажав «Добавить» в коде десериализации, а затем нажмите F12 на клавиатуре. Это приведет вас к определению. Это тот класс, который вы ожидаете увидеть?
проверьте мой вопрос еще раз, я добавил скриншот ошибки
Это очень странно. Мне никогда не приходилось явно объявлять конструктор. Попробуйте добавить public RootObject() { } в качестве конструктора без параметров по умолчанию. Это не совсем решение, если оно действительно работает, поскольку JSON.NET не требует, чтобы вы явно объявляли его.
такая же проблема, братан, кстати, этот код работает в отдельном проекте
Можете ли вы попробовать понизить версию JSON.NET на одну основную версию на случай, если это ошибка.
но братан, тогда почему он отлично работает в отдельном проекте, как версии одинаковые в обоих проектах 12.0.1
Хорошая точка зрения. Честно говоря, я понятия не имею на этом этапе. Не видя весь неудачный проект и не имея возможности его протестировать, я не могу ничего посоветовать.
я понизил, но та же проблема
спасибо, чувак, я решаю это, зайдя в параметры Android и изменив ссылку только на сборки sdk
Исключение возникает из-за того, что вы пытаетесь преобразовать содержимое 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 на формат, подобный примеру внизу.
Я думаю, вам даже не нужен этот конструктор, и вместо этого вы можете полагаться на конструктор по умолчанию.
JsonConvertбудет использовать это, если не указано другое, и установит свойства соответствующим образом.