Потребляя вложенный JSON из запроса POST, не могу присвоить вложенный JSON моему классу - PullRequest
1 голос
/ 09 января 2020

У меня есть проект WebAPI, который получает строку JSON, которая должна инициировать новый объект и заполнить его значения. Мои классы выглядят так:

    public class User
{
    public string email { get; set; }
    public string libraryId { get; set; }
    public string name { get; set; }
    public DateTime joiningDate { get; set; }
    public string zone { get; set; }
    public List<Rental> rental { get; set; }
}

    public class Rental
{
    public Dictionary<DateTime, int> rental;
}

и получаемый мной объект JSON выглядит примерно так:

{
    "email": "a@b.ca",
    "libraryId": "314159",
    "name": "Jon Doe",
    "joiningDate": "12/31/9999 11:59:59 PM",
    "zone": "13",
    "Rental": 
        [
            {"12/31/1999 11:59:59 PM": 12}, 
            {"12/30/2999 11:59:59 PM": 13}
        ]
}

Теперь, чтобы проверить правильность заполнения объекта, Я отправляю объект обратно в ответ

    public HttpResponseMessage Post([FromBody]JObject incoming)
    {
        string toString = JsonConvert.SerializeObject(incoming);                
        User request = JsonConvert.DeserializeObject<User>(toString);     

        return Request.CreateResponse(HttpStatusCode.OK, request);
    }

Вложенный JSON всегда выглядит так:

    "Rental": [
    {
        "Rental": null
    },
    {
        "Rental": null
    }
]

Мой вопрос: как мне построить класс Rental, чтобы Я могу правильно заполнить его вводом из моей строки JSON? Я пытался сохранить словарь проката в самом классе User вместо своего собственного класса, но он вернул ошибку.

1 Ответ

1 голос
/ 09 января 2020

Класс Rental должен выглядеть следующим образом:

public class Rental
{
    public KeyValuePair<DateTime, int> rental;
}

Поскольку каждая запись в массиве представляет собой KeyValuePair<DateTime, int>, а не Dictionary<DateTime, int>.

Другой подход будет изменить структуру json на:

{
    "email": "a@b.ca",
    "libraryId": "314159",
    "name": "Jon Doe",
    "joiningDate": "12/31/9999 11:59:59 PM",
    "zone": "13",
    "Rentals": 
     {
         "12/31/1999 11:59:59 PM": 12, 
         "12/30/2999 11:59:59 PM": 13
     }
}

И класс на:

public class User
{
    public string email { get; set; }
    public string libraryId { get; set; }
    public string name { get; set; }
    public DateTime joiningDate { get; set; }
    public string zone { get; set; }
    public Dictionary<DateTime, int> rentals {get;set;}
}
...