Ошибка десериализации при получении из API отдыха Wordpress, неожиданная {in [0] .title - PullRequest
1 голос
/ 11 февраля 2020

Мы создаем приложение на Xamarin, предназначенное для рынка Android. Нам нужно извлечь список объектов из Wordpress API, чтобы заполнить представление списка.

Кажется, что код в части десериализации кода содержит ошибки. EventLW - это ListView на внешнем интерфейсе приложения.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Xamarin.Forms;
using Xamarin.Forms.Xaml;
using System.Net.Http;
using Newtonsoft.Json;

namespace StudioDen.View
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class Events : ContentPage
    {
        public Events()
        {
            InitializeComponent();

            GetProducts();

        }

        private async void GetProducts()
        {
            HttpClient client = new HttpClient();
            var response = await client.GetStringAsync("http://studioden.uk/wp-json/wp/v2/events/");

            var events = JsonConvert.DeserializeObject<List<Events>>(response);
            eventLV.ItemsSource = events;
        }
    }
}

Newtonsoft. Json .JsonReaderException Message = Неожиданный символ, обнаруженный при анализе значения: {. Путь '[0] .title', строка 1, позиция 341.

enter image description here

Есть идеи о том, что здесь происходит не так? Я следовал учебному пособию по YouTube, и не думаю, что это проблема с кодом напрямую, а со строкой Json из вызова.

Ответы [ 3 ]

0 голосов
/ 11 февраля 2020

Вы должны быть уверены, что API Response в формате JSON, в противном случае сначала создайте его в формате JSON, а затем все проблемы будут решены. Например, вы можете взять Content объекта.

В частности, вы должны быть уверены, что вы собираетесь Deserialize a string, что он находится в формате JSON.

0 голосов
/ 11 февраля 2020

Создайте класс для синтаксического анализа данных JSON и в нем должны быть определения для данных, которые вы получаете

, поэтому этот класс для данных, которые вы получаете, должен быть

public class Event
{
    public string id { get; set; }
    public string date { get; set; }
    public string date_gmt { get; set; }
    public guid guid { get; set; }
    public string modified { get; set; }
    public string modified_gmt { get; set; }
    public string slug { get; set; }
    public string status { get; set; }
    public string type { get; set; }
    public string link { get; set; }
    public title title { get; set; }
    public content content { get; set; }
    public string featured_media { get; set; }
    public string template { get; set; }
}

public class guid
{
    public string rendered { get; set; }
}

public class title
{
    public string rendered { get; set; }
}
public class content
{
    public string rendered { get; set; }
    public string @protected { get; set; } //@ to ignore the keyword protected
}

также измените свой код клиента на этот

HttpClient client = new HttpClient();
    var response = await client.GetAsync("http://studioden.uk/wpjson/wp/v2/events/").ConfigureAwait(false);

    if (response.IsSuccessStatusCode)
    {
         var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

        var events = JsonConvert.DeserializeObject<List<Event>>(content);
    }

Здесь класс Event используется для сопоставления данных JSON, чтобы вы могли получить к ним доступ позже из списка

Примечание: Вы не должны выставлять здесь конечную точку в своем вопросе, вот как я увидел данные и написал для них класс

0 голосов
/ 11 февраля 2020

Вы десериализуете объект ответа, а не содержимое ответа. Вот что вам нужно сделать

private async void GetProducts()
{
    HttpClient client = new HttpClient();
    var response = await 
    client.GetAsync("http://studioden.uk/wpjson/wp/v2/events/");

     if (response.IsSuccessStatusCode)
     {
         var content = await response.Content.ReadAsStringAsync ();
         var events = JsonConvert.DeserializeObject<List<Events>>(content);
     }
     else
     {
         //Do stuff based on the status, was the content found, 
         //was there a server error etc.
     }
    ...
}

Пояснение к приведенному выше коду

Вы отправляете запрос и получаете объект ответа, который включает заголовки, код состояния, сообщения et c.

вы проверяете, что запрос выполнен успешно (если вы не хотите обрабатывать неверный запрос или ошибку сервера и т. Д. c)

, то вам нужно прочитать содержимое ответа в Затем строка десериализует json в этом строковом значении. перед окончательным заполнением списка

...