Я использую System.Text.Json.Serialization с JsonPropertyName("obj.property") в проекте веб-API на основе .NET Core 3.1 для десериализации ввода JSON в объект C # POCO. Входные данные содержат несколько атрибутов с точками, т. Е.

"id": "B1346",
"businessType": "RENTAL",
"company.city": "LUND",
"company.zipcode": "99999",
"company.email": "support@samplecompany.com",
"user.email[0]": "support2@samplecompany.com",
"user.name[0]": "Tom",
"user.email[1]": "support3@samplecompany.com",
"user.name[1]": "Harry",

Я создал следующий объект POCO:

public class Form
{
  public string Id { get; set;}
  public string BusinessType { get; set;}
  [JsonPropertyName("company.city")]
  public string CompanyCity { get; set;}
  [JsonPropertyName("company.zipcode")]
  public string CompanyZipcode { get; set;}
  [JsonPropertyName("company.email")]
  public string CompanyEmail { get; set;}
  [JsonPropertyName("user.email")]
  public List<string> UserEmail { get; set;}
  [JsonPropertyName("user.name")]
  public List<string> UserName { get; set;}
}

До сих пор это работало для простых атрибутов с точкой, например, company.city, но не для элементов массива, например, users.name[0]

public async Task PostApplication(Form form)
{ ... }

Быстрое наблюдение (во время отладки) показывает успешную десериализацию всех свойств параметра form, кроме массивов:

quickwatch

1
Imtiaz 15 Сен 2021 в 17:12

2 ответа

Лучший ответ

Предполагая, что у вас есть только [0] и [1], попробуйте эти классы

public class Root
    {
        public string id { get; set; }
        public string businessType { get; set; }

        [JsonProperty("company.city")]
        public string CompanyCity { get; set; }

        [JsonProperty("company.zipcode")]
        public string CompanyZipcode { get; set; }

        [JsonProperty("company.email")]
        public string CompanyEmail { get; set; }

        [JsonProperty("user.email[0]")]
        public string UserFirsEmail { get; set; }

        [JsonProperty("user.name[0]")]
        public string UserFirstName { get; set; }

        [JsonProperty("user.email[1]")]
        public string UserSecondEmail { get; set; }

        [JsonProperty("user.name[1]")]
        public string UserSecondName { get; set; }
    }

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

var jD = JsonConvert.DeserializeObject<Root>(json);
var data = new Data {
        Id=jD.id,
        BusinessType=jD.businessType,
        Company = new Company { City = jD.CompanyCity, Email = jD.CompanyEmail },
        User = new User {Name=jD.UserName0, Email=jD.UserEmail0, SecondName=jD.UserName1, SecondEmail=jD.UserEmail1}
    }

Классы

public class Data
{
    public string Id { get; set; }
    public string BusinessType { get; set; }

    public Company Company {get;set;}
    public User User {get;set;}
}
public class Company
{
    public string City { get; set; }
    public string Zipcode { get; set; }
    public string Email { get; set; }
}
public class User
{
    public string Email { get; set; }
    public string Name { get; set; }
    public string SecondEmail { get; set; }
    public string SecondName { get; set; }
}
1
Serge 15 Сен 2021 в 14:59

Элементы в списке должны иметь формат списка JSON, он должен выглядеть так, чтобы десериализоваться как список строк:

{
  "id": "B1346",
  "businessType": "RENTAL",
  "company.city": "LUND",
  "company.zipcode": "99999",
  "company.email": "support@samplecompany.com",
  "user.email": ["support2@samplecompany.com", "support3@samplecompany.com"]
  "user.name": ["Tom","Harry]
}
0
Shabbir Hussain 15 Сен 2021 в 14:22