Десериализовать JSON в объект C#

Я пытаюсь десериализовать объект 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\"}": ""  }}

это выглядит странно

Вместо этого вы должны десериализоваться в RootObject. И вам нужно изменить имя свойства, чтобы оно соответствовало имени в json (или наоборот). И класс User_, вероятно, должен быть User

Magnus 09.04.2019 09:03

Вы пробовали json2csharp.com?

Oliver 09.04.2019 09:04

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

Lasse V. Karlsen 09.04.2019 09:09

Например, вы отредактировали свой вопрос, чтобы десериализовать его в RootObject вместо User_. Это решило вашу проблему? Если это так, то, скорее всего, это было неправильно, поскольку, если это исправило ваш вопрос, вам, вероятно, следует удалить вопрос, поскольку он больше не имеет смысла.

Lasse V. Karlsen 09.04.2019 09:09

@OP Вы не должны редактировать свой вопрос, чтобы он работал после того, как вы опубликовали неработающий код.

Llama 09.04.2019 09:09

@LasseVågsætherKarlsen нет, это не сработало

Arif YILMAZ 09.04.2019 09:12

Затем опубликуйте свой код действительный в качестве кода, который вы разместили в вопросе работает.

Lasse V. Karlsen 09.04.2019 09:14

@Arif Код, который вы разместили в своем вопросе работает. Как я уже сказал: вам не следует редактировать свой вопрос в решении, потому что это означает, что ваш вопрос больше не имеет смысла и делает ответы недействительными.

Llama 09.04.2019 09:15

Мне нравится путаница вопросов Json/C#, каждый из которых приходит с новым «Json2CSharp», «Тот же код, то же самое». Либо это обман, либо опечатка, либо нужен MCVE. Нам не нужно так много ответов.

xdtTransform 09.04.2019 09:16

JSON на вашем скриншоте не соответствует json в вашем вопросе.

Lasse V. Karlsen 09.04.2019 09:17

Казалось бы, у вас есть строка JSON в качестве ключа в объекте JSON.

Llama 09.04.2019 09:18

Честно говоря, это не похоже на действительный json. Объект внутри объекта, я не уверен, что это законно.

Lasse V. Karlsen 09.04.2019 09:18

@LasseVågsætherKarlsen, Это действительно так! Это корневой объект, сериализуемый как свойство, имеющее пустую строку в качестве значения. все побег кажется непрактичным, но действительным

xdtTransform 09.04.2019 09:20

@LasseVågsætherKarlsen, но почему json такой. это действительно.

Arif YILMAZ 09.04.2019 09:21

@ArifYILMAZ, у вас есть код на стороне сервера или вам действительно нужно играть с этим?

xdtTransform 09.04.2019 09:24

Нет, это недопустимый json, {{ ... }} недопустимый json. Может быть, отладчик удваивает эти фигурные скобки? У вас есть это: {{ "key": "" }}, где key здесь json в строке.

Lasse V. Karlsen 09.04.2019 09:36

Пара вопросов. Какой тип json в этом коде? Я знаю, что json.ToString() — это строка, но что такое json? Кроме того, вы можете сделать что-то вроде Console.WriteLine(json.ToString());, а затем скопировать этот вывод нам? Я хочу убедиться, что мы не видим вещей, которые отладчик добавляет «для удобства».

Lasse V. Karlsen 09.04.2019 09:38
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
17
1 319
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

При прямой десериализации объекта класса имя класса в 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 проблемы в вашем классе С#

  1. В вашем классе RootObject вы должны использовать

    public User_ User{get;set;}
    
  2. Когда вы сериализуете 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\"}": "" }}

Arif YILMAZ 09.04.2019 09:18

@ArifYILMAZ, так что json плохо отформатирован. Вот почему это терпит неудачу в вашей программе.

JoKeRxbLaCk 09.04.2019 09:21

Основная проблема заключается в том, что ваш 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);

Выход:

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