Newtonsoft.Json.JsonSerializationException: произошло

#c# #xamarin.forms #observablecollection #jsonconvert

#c# #xamarin.forms #наблюдаемая коллекция #jsonconvert

Вопрос:

Я использую службу rest, но когда я де сериализую строку JSON, она выдает это исключение? Что означает это исключение?

Класс

 public class Product
{
    public string PROD
    {
        get { return prod; }
        set { prod = value; }
    }
    
    //Department Number
    [JsonProperty("DPID")]
    public int DPID
    {
        get { return dpid; }
        set { dpid = value; }
    }
    
    //Sub Department Number
    [JsonProperty("SDID")]
    public int SDID
    {
        get { return sdid; }
        set { sdid = value; }
    }
    
    //Category Number
    [JsonProperty("CGID")]
    public int CGID
    {
        get { return cgid; }
        set { cgid = value; }
    }
    
    //Sub Category Number
    [JsonProperty("SCID")]
    public int SCID
    {
        get { return scid; }
        set { scid = value; }
    }
    
    //Product Description
    [JsonProperty("PDSC")]
    public string PDSC
    {
        get { return pdsc; }
        set { pdsc = value; }
    }
    
    //Product Brand
    [JsonProperty("PBRN")]
    public string PBRN
    {
        get { return pbrn; }
        set { pbrn = value; }
    }
    
    //Season Code
    [JsonProperty("SESN")]
    public string SESN
    {
        get { return sesn; }
        set { sesn = value; }
    }
    
    //Issue Quantity
    [JsonProperty("IQTY")]
    public string IQTY
    {
        get { return iqty; }
        set { iqty = value; }
    }
    
    //Currency Code
    [JsonProperty("CURR")]
    public string CURR
    {
        get { return curr; }
        set { curr = value; }
    }
    
    //Selling Price
    [JsonProperty("SELL")]
    public decimal SELL
    {
        get { return sell; }
        set { sell = value; }
    }
    
    //Product SKU Code
    [JsonProperty("PSKU")]
    public string PSKU
    {
        get { return psku; }
        set { psku = value; }
    }
    
    //Product Size
    [JsonProperty("PSZE")]
    public string PSZE
    {
        get { return psze; }
        set { psze = value; }
    }
    
    //Product Colour
    [JsonProperty("PCOL")]
    public string PCOL
    {
        get { return pcol; }
        set { pcol = value; }
    }
    
    //Pre-pack Code
    [JsonProperty("PPCD")]
    public string PPCD
    {
        get { return ppcd; }
        set { ppcd = value; }
    }
    
    //Image URL
    public string IURL
    {
        get { return iurl; }
        set { iurl = value; }
    }        
    
    [JsonProperty("DPDS")]
    public string DPDS
    {
        get { return dpds; }
        set { dpds = value; }
    }
}
    
  

Потребитель

Это то, что я использую для использования службы rest, а затем она отправляет мне строку JSON, которую я де сериализую в объект типа Observable Collection, называемый products .

 public ObservableCollection<Product> products = new ObservableCollection<Product>();

public async Task<ObservableCollection<Product>> GetProducts()
{
    try
    {
        string uri = url   "/product;
        _client.Timeout = TimeSpan.FromSeconds(300);

        HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Get, uri);
        var response2 = await _client.SendAsync(message);

        if (response2.IsSuccessStatusCode)
        {
            var content = await response2.Content.ReadAsStringAsync();
            var prodlist = JsonConvert.DeserializeObject<ObservableCollection<Product>>(content);
            products = prodlist;
            return products;
        }
        else if (response2.StatusCode == HttpStatusCode.NotFound)
        {
            return products;
        }

        return products;
    }
    catch (JsonException ex)
    {
        throw ex;
    }
}
  

Строка JSON

URI возвращает большую строку этого формата при вызове.

 {
  "PROD": "5510B-BK        ",
  "DPID": 0,
  "SDID": 0,
  "CGID": 0,
  "SCID": 0,
  "SPID": 0,
  "PDSC": "5510B BLACK BOAT SHOE                             ",
  "PBRN": "Footwear Direct",
  "SESN": "2018  ",
  "IQTY": "Pair           ",
  "CURR": "ZAR",
  "SELL": 0,
  "PSKU": "5510B-BK            ",
  "PSZE": "12      ",
  "PCOL": "BK                                 ",
  "PPCD": "A     ",
  "DPDS": "None                     "
}
  

Исключение, которое я получаю

Сообщение об исключении

Пожалуйста, обратите внимание, что это то, что он говорит при извлечении одного продукта, но то же самое происходит при извлечении всего объекта, позиция которого тогда меняется.

Ошибка преобразования значения «{«PROD»:»5510B-BK «, «DPID»: 0, «SDID»:0,»CGID»: 0,»SCID»: 0,»SPID»: 0, «PDSC»:»5510B BLACK BOAT SHOE «, «PBRN»:»Прямая обувь», «SESN»:»2018 «, «IQTY»: «Пара», «CURR»:»ZAR», «ПРОДАТЬ»: 0.0000, «PSKU»:»5510B-BK», «PSZE»:»12 «, «PCOL»:»BK»,»PPCD»:»A «,»DPDS»:»None «}» для ввода ‘WarehouseProMobile.Модели.Продукт’. Путь «, строка 1, позиция 427.

Решаемая

Оказывается, мой rest API сериализован в JSON, и когда объект был отправлен по сети, веб-сервер также сериализовал мой объект, что сделало строку бесполезной. Исправлено путем настройки API только для отправки объектов.

Комментарии:

1. Не могли бы вы добавить сведения об исключении, например Message , StackTrace и HResult ?

2. uri является ли строка unterminated во втором блоке кода

3. Как мне получить сообщение об исключении и т. Д.?

4. Строка json представляет собой словарь, а не список. Попробуйте изменить свой список продуктов на экземпляр Product .

Ответ №1:

Это ваш POCO:

 public class Product
{
    public string PROD { get; set; }

    //Department Number
    [JsonProperty("DPID")]
    public int DPID { get; set; }


    //Sub Department Number
    [JsonProperty("SDID")]
    public int SDID { get; set; }

    //Category Number
    [JsonProperty("CGID")]
    public int CGID { get; set; }

    //Sub Category Number
    [JsonProperty("SCID")]
    public int SCID { get; set; }

    //Product Description
    [JsonProperty("PDSC")]
    public string PDSC { get; set; }


    //Product Brand
    [JsonProperty("PBRN")]
    public string PBRN { get; set; }


    //Season Code
    [JsonProperty("SESN")]
    public string SESN { get; set; }

    //Issue Quantity
    [JsonProperty("IQTY")]
    public string IQTY { get; set; }


    //Currency Code
    [JsonProperty("CURR")]
    public string CURR { get; set; }

    //Selling Price
    [JsonProperty("SELL")]
    public decimal SELL { get; set; }

    //Product SKU Code
    [JsonProperty("PSKU")]
    public string PSKU { get; set; }

    //Product Size
    [JsonProperty("PSZE")]
    public string PSZE { get; set; }

    //Product Colour
    [JsonProperty("PCOL")]
    public string PCOL { get; set; }

    //Pre-pack Code
    [JsonProperty("PPCD")]
    public string PPCD { get; set; }
    //Image URL
    public string IURL { get; set; }

    [JsonProperty("DPDS")]
    public string DPDS { get; set; }
}
  

Измените свой метод действия на:

 public async Task<ObservableCollection<Product>> GetProducts()
{
    try
    {
        string uri = url   "/product;
        _client.Timeout = TimeSpan.FromSeconds(300);

        HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Get, uri);
        var response2 = await _client.SendAsync(message);

        ObservableCollection<Product> products = new ObservableCollection<Product>();
        if (response2.IsSuccessStatusCode)
        {
            var content = await response2.Content.ReadAsStringAsync();
            Product product = JsonConvert.DeserializeObject<Product>(content);
            products.Add(product);
        }

        return products;
    }
    catch (Exception ex)
    {
        throw ex;
    }
}
  

Комментарии:

1. Я не понимаю, где product products объявлены и?

2. @iakobski, модифицированный мой ответ products исходит из сообщения OP, я не знаю

Ответ №2:

Это то, что я обычно делаю:

Я создаю класс, который соответствует атрибутам JSON (старайтесь использовать nullable, где это возможно):

 public class Testingo
{

    public class Obj
    {
        public string PROD { get; set; }
        public int? DPID { get; set; }
        public int? SDID { get; set; }
        public int? CGID { get; set; }
        public int? SCID { get; set; }
        public int? SPID { get; set; }
        public string PDSC { get; set; }
        public string PBRN { get; set; }
        public string SESN { get; set; }
        public string IQTY { get; set; }
        public string CURR { get; set; }
        public int? SELL { get; set; }
        public string PSKU { get; set; }
        public string PSZE { get; set; }
        public string PCOL { get; set; }
        public string PPCD { get; set; }
        public string DPDS { get; set; }
    }

}
  

И тогда я бы просто написал:

 var jsonisedObject = JsonConvert.DeserializeObject<List<Testingo.Obj>>(jsonStringHere);
  

измените jsonStringHere на строку, содержащую ваши фактические данные JSON

Вы можете попросить Visual Studio сгенерировать для вас класс, готовый к JSON. Просто скопируйте данные json, а затем внутри класса нажмите «Редактировать» -> «Вставить специальный» -> «Вставить Json как классы»!