десериализация вложенных json - нужен другой набор глаз - PullRequest
0 голосов
/ 15 декабря 2018

Я пытался заставить этот json десериализоваться в течение двух дней, используя RestSharp.Я просмотрел сайт github RestSharp, посмотрел на бесчисленные примеры и потратил много времени на переполнение стека, чтобы найти ответ безрезультатно.Мой код ранее работал отлично, но поставщик изменил свою версию API, и я был вынужден сделать обновление, чтобы продолжать использовать приложение для моей юридической практики.Мой json выглядит следующим образом (информация о клиенте была удалена и заменена общей информацией):

    {
    "data":[
    {
    "id":1035117666,
    "client":
        {
        "id":905422394,
        "name":"client1"
        },
    "display_number":"11-00012",
    "description":"General",
    "practice_area":
        {
        "id":4269978,
        "name":"Business"
        },
    "status":"Open",
    "open_date":"2011-12-14",
    "close_date":null,
    "billing_method":"hourly"
    },
    {
    "id":1035117768,
    "client":
        {
        "id":905422506,
        "name":"client2"
        },
    "display_number":"12-00037",
    "description":"HOA",
    "practice_area":
        {
        "id":4269978,
        "name":"Business"
        },
    "status":"Open",
    "open_date":"2012-08-07",
    "close_date":null,
    "billing_method":"hourly"
    }
],
"meta":
    {
    "paging":
        {
        "next":"https://app.goclio.com/api/v4/matters.json?fields=id%2C+client%7Bid%2C+name%7D%2C+display_number%2C+description%2C+practice_area%7Bid%2C+name%7D%2C+status%2C+open_date%2C+close_date%2C+billing_method&limit=2&page_token=BAh7BjoLb2Zmc2V0aQc%3D--b1ea3eba20c8acefbcdfc7868debd1e0ee630c64&status=Open"
        },
    "records":91
    }
}

Я построил следующую схему в своем коде c #:

public class MatterList
{
    public List<Matter> matters { get; set; }
    public Meta meta { get; set; }
}

public class Meta
{
    public Paging paging { get; set; }
    public int records { get; set; }
}

public class Paging
{
    public string previous { get; set; }
    public string next { get; set; }
}

[DeserializeAs(Name = "data")]
public class Matter
{
    public int id { get; set; }
    public Client client { get; set; }
    public string display_number { get; set; }
    public string description { get; set; }
    public PracticeArea practice_area { get; set; }
    public string status { get; set; }
    public DateTime open_date { get; set; }
    public DateTime close_date { get; set; }
    public string billing_method { get; set; }
    public string type = "matter";

}

public class PracticeArea
{
    public int id { get; set; }
    public string name { get; set; }
}

public class Client
{
    public int id { get; set; }
    public string name { get; set; }
}

Когда я запускаюМетод десериализации RestSharp Я отправляю результат объекту типа MatterList, используя следующую строку кода

MatterList matterList = jsonHandler.Deserialize<MatterList>(response);

До сих пор я пытался десериализовать без классов Meta или Paging POCO ссопутствующее изменение в классе MatterList (исключая свойство Meta).

Я пробовал с и без директивы [DeserializeAs (Name = "data")].

Я пытался установить RootElement ответа json до десериализации.

Я попытался сократить десериализацию, объединив ее с кодом запроса Execute IRestResponse<MatterList> matterList = client.Execute<MatterList>(request);

Я создал контейнерный класс с именем MatterContainer, который я поместил между классами MatterList и Matter в схеме:

public class MatterList
{
    public List<MatterContainer> matters { get; set; }
}

public class MatterContainer
{
    public Matter matter { get; set; }
}

public class Matter
{
    public int id { get; set; }
    public Client client { get; set; }
    public string display_number { get; set; }
    public string description { get; set; }
    public PracticeArea practice_area { get; set; }
    public string status { get; set; }
    public DateTime open_date { get; set; }
    public DateTime close_date { get; set; }
    public string billing_method { get; set; }
    public string type = "matter";

}

Я знаю, что я правильно получаю ответ json с сервера, поэтому мой запрос верен, а MatterList не равен нулю после десериализации.Проблема в том, что я не могу заставить десериализацию фактически заполнить вопросы List в классе MatterList.

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

Спасибо!

1 Ответ

0 голосов
/ 15 декабря 2018

I думаю, ваш [DeserializeAs(Name = "data")] атрибут находится не в том месте.Попробуйте вместо этого поместить его в корневой класс:

public class MatterList
{
    [DeserializeAs(Name = "data")]
    public List<Matter> matters { get; set; }
    public Meta meta { get; set; }
}

или попробуйте переименовать это свойство в data

...