【问题标题】:Newtonsoft.Json.JsonSerializationException: <Timeout exceeded getting exception details> occurredNewtonsoft.Json.JsonSerializationException: <Timeout exceeded getting exception details> 发生
【发布时间】:2019-08-30 08:24:22
【问题描述】:

我正在使用休息服务,但是当我对 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; }
    }
}
    

消费者

这是我用来消费剩余服务的东西,然后它向我发送一个 JSON 字符串,我将其反序列化为一个称为产品的 Observable Collection 类型的对象。

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

The exception I get

异常信息

请注意,这是拉单个产品时所说的,但拉所有对象时会发生同样的事情,然后位置会发生变化。

错误转换值 "{"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.0000,"PSKU ":"5510B-BK","PSZE":"12","PCOL":"BK","PPCD":"A","DPDS":"None"}" 输入 'WarehouseProMobile.Models.Product' .路径 '',第 1 行,位置 427。

已解决

结果我的其余 API 序列化为 JSON,当对象通过网络发送时,Web 服务器也序列化了我的对象,这使得字符串无用。通过将 API 调整为仅发送对象来解决此问题。

【问题讨论】:

  • 能否添加异常详细信息,如MessageStackTraceHResult
  • uri 是您的第二个代码块中的未终止字符串
  • 如何获取异常信息等?
  • json 字符串是字典而不是列表。尝试将您的 prodlist 更改为 Product 的实例。

标签: c# xamarin.forms observablecollection jsonconvert


【解决方案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;
    }
}

【讨论】:

  • 我不关注,productproducts 声明在哪里?
  • @iakobski,修改了我的答案 products 来自 OP 的帖子,我不知道
【解决方案2】:

这是我通常做的:

我创建了一个匹配 JSON attrs 的类(尽可能使用 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 数据,然后在一个类中,点击 Edit->Paste Special->Paste Json as classes!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    • 2016-09-13
    • 1970-01-01
    • 2022-10-14
    相关资源
    最近更新 更多