Как десериализовать массив с помощью Refit?

У меня есть следующая ошибка при попытке десериализовать Json с помощью Refit в PCL:

Невозможно десериализовать текущий объект JSON (например, {"name":"value"}) в тип "System.Collections.Generic.List`1[UserItem]", поскольку для этого типа требуется массив JSON (например, [1,2,3] ) для правильной десериализации. Чтобы исправить эту ошибку, либо измените JSON на массив JSON (например, [1,2,3]), либо измените десериализованный тип, чтобы он был обычным типом .NET (например, не примитивный тип, такой как целое число, а не тип коллекции, такой как массив или список), который можно десериализовать из объекта JSON. JsonObjectAttribute также можно добавить к типу, чтобы заставить его десериализоваться из объекта JSON. Путь 'user.id', строка 1, позиция 42.

Я думаю, что это происходит из массивов, возвращенных для интересов?

{
    "error": {
        "code": 0,
        "msg": ""
    },
    "user": {
        "id": "5",
        "first_name": "test",
        "last_name": "test",
        "email": "[email protected]",
        "auth_token": "****",
        "date_of_birth": "0001-05-06 00:00:00",
        "group_id": "1",
        "group_name": null,
        "postal_code": "56456",
        "city": "Annecy",
        "country": "France",
        "facebook_id": null,
        "facebook_img": null,
        "status": null,
        "is_activated": null,
        "gcm_id": "GHJK",
        "device_id": null,
        "platform": "android",
        "interest": ["1", "2"],
        "profile_pic": "profile.jpg",
        "cover_img": "cover.jpg",
        "address": null,
        "invoicing_address": "address",
        "invoicing_city": "city",
        "invoicing_country": "",
        "invoicing_postal_code": "78654",
        "gender": null,
        "company_no": "1234",
        "company_name": "",
        "about_company": "",
        "company_logo": "",
        "company_legal_name": "lumao",
        "company_contact_no": "",
        "company_address": "",
        "company_city": "",
        "company_country": "",
        "company_postal_code": "",
        "vat_no": "",
        "telephone": null,
        "membership_status": null,
        "contact_status": 2,
        "company_interests": [],
        "needs": ["not_implemented"]
    }
}

РЕДАКТИРОВАТЬ: Вот как я создаю экземпляр Refit:

Func<HttpMessageHandler, IFlairPlayApi> createClient = messageHandler =>
            {
                var client = new HttpClient(messageHandler)
                {
                    BaseAddress = new Uri(ApiBaseAddress)
                };

                return RestService.For<IFlairPlayApi>(client);
            };

NativeMessageHandler msgHandler = new NativeMessageHandler();
        msgHandler.DisableCaching = true;
        _speculative = new Lazy<IFlairPlayApi>(() => createClient(

            new RateLimitedHttpMessageHandler(msgHandler, Priority.Speculative)
));

И как я вызываю службу:

[Get("/getuser.json")]
Task<UserResponse> GetUser(int userid, int contact_id, string langval);

РЕДАКТИРОВАТЬ 2: я попытался изменить UserResponse на динамический, а затем проанализировать динамический объект в UserReponse, но он все равно лишил интересов. И я бы потерял преимущество использования Refit :

    [Get("/getuser.json")]
    Task<dynamic> GetUser(int userid, int contact_id, string langval);

dynamic userObject = await FPApi.Speculative.GetUser(user.id, contact_id, FPEngine.Instance.Lang);
                JObject jUser = userObject as JObject;
                UserResponse response = jUser.ToObject<UserResponse>();

Я делаю это неправильно? нет ли простого способа получить массивы строк?


person GreuM    schedule 18.07.2018    source источник
comment
Вы можете опубликовать свой код С#?   -  person Prashant Pimpale    schedule 18.07.2018
comment
@PrashantPimpale вот код, спасибо за помощь :)   -  person GreuM    schedule 19.07.2018
comment
Используйте dynamic для разбора JSON   -  person Prashant Pimpale    schedule 19.07.2018
comment
Взгляните на: stackoverflow.com/a/46184976/7124761   -  person Prashant Pimpale    schedule 19.07.2018
comment
Спасибо за вашу помощь @PrashantPimpale. Я попытался изменить тип возврата на динамический. Теперь я получаю динамический объект, содержащий все параметры, включая интересы. Теперь я должен преобразовать этот объект в UserResponse. Тем не менее, метод, который я пробовал, все еще лишает интересов ... И я теряю все преимущества использования Refit. Если мне придется идти по этому пути ... Я отредактировал вопросы с помощью этих шагов. Что вы думаете ?   -  person GreuM    schedule 19.07.2018


Ответы (1)


У меня была такая же проблема, я решил ее следующим образом:

Служба возвращает, возвращает строку, то есть необработанный Json:

public interface IApiHgFinance
{
    [Get("/taxes?key=minhachave")]
    Task<string> GetTaxes();
}

А в коде, где я вызываю сервис, я обрабатываю Json:

    try
    {
        IApiHgFinance ApiHgFinance = Refit.RestService.For<IApiHgFinance>("https://api.hgbrasil.com/finance");
        var result = await ApiHgFinance.GetTaxes();

        var jo = Newtonsoft.Json.Linq.JObject.Parse(result);

        var taxes = jo["results"].ToObject<itemTaxes[]>();
        foreach (var item in taxes)
        {
            MessageBox.Show($"Taxa CDI   : {item.Cdi} \nTaxa Selic : {item.Selic} \nData Atualização: {item.Date}",
                "Atualização de informações", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show($"Erro: {ex.Message}", "Erro ao tentar recuperar as taxas do dia.", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
person Abner    schedule 24.02.2020