Я пытаюсь десериализовать объект json в объект С#, но не смог этого сделать. Вот мой объект json, который я отправляю
{
"User_":
{
"Email":"[email protected]",
"Password":"pass1"
}
}
вот мои классы С#, которые я использую
public class User_
{
public string Email { get; set; }
public string Password { get; set; }
}
открытый класс User_ { общедоступная строка Электронная почта {получить; задавать; } общедоступная строка Пароль { получить; задавать; } }
public class RootObject
{
public User_ User_ { get; set; }
}
вот код, который я использую для десериализации
RootObject request = JsonConvert.DeserializeObject<RootObject>(json.ToString());
Этот код создает объект User_, но поля Email и Password пусты. Что я здесь делаю неправильно?
Пока я отлаживал, я увидел, что грядет
{{ "{\"Email_\":\"[email protected]\",\"Password_\":\"pass1\"}": "" }}
это выглядит странно
Вы пробовали json2csharp.com?
Пожалуйста, создайте минимальный воспроизводимый пример, так как прямо сейчас ваш json делает десериализуется в ваши объекты. Другими словами, ваш код работает так, как вы этого хотите.
Например, вы отредактировали свой вопрос, чтобы десериализовать его в RootObject
вместо User_
. Это решило вашу проблему? Если это так, то, скорее всего, это было неправильно, поскольку, если это исправило ваш вопрос, вам, вероятно, следует удалить вопрос, поскольку он больше не имеет смысла.
@OP Вы не должны редактировать свой вопрос, чтобы он работал после того, как вы опубликовали неработающий код.
@LasseVågsætherKarlsen нет, это не сработало
Затем опубликуйте свой код действительный в качестве кода, который вы разместили в вопросе работает.
@Arif Код, который вы разместили в своем вопросе работает. Как я уже сказал: вам не следует редактировать свой вопрос в решении, потому что это означает, что ваш вопрос больше не имеет смысла и делает ответы недействительными.
Мне нравится путаница вопросов Json/C#, каждый из которых приходит с новым «Json2CSharp», «Тот же код, то же самое». Либо это обман, либо опечатка, либо нужен MCVE. Нам не нужно так много ответов.
JSON на вашем скриншоте не соответствует json в вашем вопросе.
Казалось бы, у вас есть строка JSON в качестве ключа в объекте JSON.
Честно говоря, это не похоже на действительный json. Объект внутри объекта, я не уверен, что это законно.
@LasseVågsætherKarlsen, Это действительно так! Это корневой объект, сериализуемый как свойство, имеющее пустую строку в качестве значения. все побег кажется непрактичным, но действительным
@LasseVågsætherKarlsen, но почему json такой. это действительно.
@ArifYILMAZ, у вас есть код на стороне сервера или вам действительно нужно играть с этим?
Нет, это недопустимый json, {{ ... }}
недопустимый json. Может быть, отладчик удваивает эти фигурные скобки? У вас есть это: {{ "key": "" }}
, где key
здесь json в строке.
Пара вопросов. Какой тип json
в этом коде? Я знаю, что json.ToString()
— это строка, но что такое json
? Кроме того, вы можете сделать что-то вроде Console.WriteLine(json.ToString());
, а затем скопировать этот вывод нам? Я хочу убедиться, что мы не видим вещей, которые отладчик добавляет «для удобства».
При прямой десериализации объекта класса имя класса в JSON не требуется. Если вы, с другой стороны, десериализуете JSON, указанный выше, тогда десериализуйте с помощью RootObject
var user = JsonConvert.DeserializeObject<RootObject>(json.ToString()).User_;
с участием
public class RootObject
{
public User_ User_ { get; set; }
}
ИЛИ
Вместо этого десериализуйте следующий JSON:
{
"Email":"[email protected]",
"Password":"pass1"
}
Я считаю, что у вас есть 2 проблемы в вашем классе С#
В вашем классе RootObject
вы должны использовать
public User_ User{get;set;}
Когда вы сериализуете Json, вы должны использовать.
User_ request = JsonConvert.DeserializeObject<RootObject>(json.ToString());
Это решит вашу проблему.
Можете ли вы попробовать этот код.
public class User_
{
public string Email { get; set; }
public string Password { get; set; }
}
public class RootObject
{
public User_ User { get; set; }
}
Десериализовать операцию:
RootObject request = JsonConvert.DeserializeObject<RootObject>(json.ToString());
Если я сделаю это, я получу правильные значения Email
и Password
:
public class User_
{
public string Email { get; set; }
public string Password { get; set; }
}
public class RootObject
{
public User_ User_ { get; set; }
}
class Program
{
static void Main(string[] args)
{
string jsonString = "{\"User_\":{\"Email\":\"[email protected]\",\"Password\":\"pass1\"}}";
RootObject request = JsonConvert.DeserializeObject<RootObject>(jsonString.ToString());
Console.WriteLine("Email: {0}", request.User_.Email);
Console.WriteLine("Password: {0}", request.User_.Password);
Console.ReadLine();
}
}
Вы видите, как это работает ЗДЕСЬ
Во время отладки я получаю это {{ "{\"Email\":\"[email protected]\",\"Пароль\":\"pass 1\"}": "" }}
@ArifYILMAZ, так что json
плохо отформатирован. Вот почему это терпит неудачу в вашей программе.
Основная проблема заключается в том, что ваш RootObject сериализуется как имя свойства нового объекта с пустой строкой в качестве значения. Результат многих сериализаций на стороне сервера.
И вы можете легко справиться с этим, следующий класс будет работать только для этого точного ответа Json после изменения пароля/электронной почты, вам понадобится новый.
public partial class DontDoThis
{
[JsonProperty("{\"Email_\":\"[email protected]\",\"Password_\":\"pass1\"}")]
public string EmailTestTestComPasswordPass1 { get; set; }
}
Чтобы исправить это, вам осталось:
- Измените сторону сервера кода, чтобы обеспечить правильный результат.
- Манипуляции со строками для удаления и отмены результата.
- Десериализовать один раз и снова десериализовать.
Почему бы не использовать [JsonProperty("KeyName")]
, когда ваши имена ключей не являются чистыми алфавитами.
[JsonProperty("KeyName")]
предоставляет вам преимущество десериализации такого json, который содержит некоторые ключи, такие как
И многое другое
Просто добавьте этот атрибут в свойство вашего класса, например
[JsonProperty("User_")]
public User User { get; set; }
И это делает имя вашего свойства простым и более читаемым.
Итак, наконец, для вашего json
{
"User_":
{
"Email_":"[email protected]",
"Password_":"pass1"
}
}
Все классы после добавления JsonProperty
выглядят как
public class RootObject
{
[JsonProperty("User_")]
public User User { get; set; }
}
public class User
{
[JsonProperty("Email_")]
public string Email { get; set; }
[JsonProperty("Password_")]
public string Password { get; set; }
}
Применение:
RootObject request = JsonConvert.DeserializeObject<RootObject>(json.ToString());
Console.WriteLine(request.User.Email);
Console.WriteLine(request.User.Password);
Выход:
Вместо этого вы должны десериализоваться в
RootObject
. И вам нужно изменить имя свойства, чтобы оно соответствовало имени в json (или наоборот). И классUser_
, вероятно, должен бытьUser