Десериализовать JSON в объект C # - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь десериализовать объект json в объект c #, но не могу этого сделать. Вот мой объект json, который я отправляю

{
    "User_":
    {
        "Email":"test@test.com",
        "Password":"pass1"
    }
}

вот мои c # классы, которые я использую

public class User_
{
    public string Email { get; set; }
    public string Password { get; set; }
}

открытый класс User_ { общедоступная строка Email {get; задавать; } публичная строка Password {get; задавать; } }

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

вот код, который я использую для десериализации

RootObject request = JsonConvert.DeserializeObject<RootObject>(json.ToString());

Этот код создает объект User_, но поля Email и Password являются пустыми. Что я тут не так делаю?

Пока я отлаживал, я видел, что грядет

{{ "{\"Email_\":\"test@test.com\",\"Password_\":\"pass1\"}": ""  }}

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

Ответы [ 6 ]

2 голосов
/ 09 апреля 2019

При десериализации объекта класса напрямую, имя класса не требуется в JSON. Если вы, с другой стороны, десериализуете JSON, указанный выше, то десериализуйте с помощью RootObject

var user = JsonConvert.DeserializeObject<RootObject>(json.ToString()).User_;

с

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

ИЛИ

Вместо этого десериализуйте следующий JSON:

    {
        "Email":"test@test.com",
        "Password":"pass1"
    }
1 голос
/ 09 апреля 2019

Если я это сделаю, я получу правильные значения 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\":\"test@test.com\",\"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();
    }
  }

Вы можете видеть это работает ЗДЕСЬ

0 голосов
/ 09 апреля 2019

Почему бы не использовать [JsonProperty("KeyName")], если ваши имена ключей не являются чистыми алфавитами.

[JsonProperty("KeyName")] предоставляет вам преимущество десериализации такого json, который содержит некоторые ключи, такие как

  • Пользователь_
  • Пользователь $
  • @ Пользователь
  • * Пользователь &

и многие другие

Просто добавьте этот атрибут к свойству класса, как

[JsonProperty("User_")]
public User User { get; set; }

И это делает имя вашего свойства простым и понятным

Итак, наконец, для вашего JSON

{
    "User_":
    {
        "Email_":"test@test.com",
        "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);

Выход:

enter image description here

0 голосов
/ 09 апреля 2019

Основная проблема заключается в том, что ваш RootObject является сериализованным как имя свойства нового объекта со строкой пустым в качестве значения.Результатом многих сериализации на стороне сервера.

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

public partial class DontDoThis
{
    [JsonProperty("{\"Email_\":\"test@test.com\",\"Password_\":\"pass1\"}")]
    public string EmailTestTestComPasswordPass1 { get; set; }
}

Чтобы исправитьс этим у вас осталось:
- изменить сторону сервера кода для обеспечения правильного результата.
- манипулирование строками для удаления и отмены результата.
- десериализация один раз и десерилизация снова.

0 голосов
/ 09 апреля 2019

Можете ли вы попробовать этот код.

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());
0 голосов
/ 09 апреля 2019

Я полагаю, у вас есть 2 проблемы в вашем классе c #

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

    public User_ User{get;set;}
    
  2. Когда вы изолируете Json, вы должны использовать.

    User_ request = JsonConvert.DeserializeObject<RootObject>(json.ToString());
    

Это решит вашу проблему.

...