Мы создаем приложение на 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 из вызова.

2
Daniel Tracey 11 Фев 2020 в 16:00

3 ответа

Лучший ответ

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

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.
     }
    ...
}

Объяснение приведенного выше кода

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

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

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

0
Kevin 11 Фев 2020 в 14:17

Создайте класс для синтаксического анализа данных 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
Leo Jebran 11 Фев 2020 в 14:28

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

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

0
LopDev 7 Мар 2020 в 08:49