读取字节时出现意外的标记:字符串

时间:2018-02-28 05:52:16

标签: c# arrays json asp.net-mvc byte

来自API的JSON响应:

public class LabelResult
{
    public long order_id { get; set; }
    public string order_number { get; set; }
    public string carrier_name { get; set; }
    public Array tracking_numbers { get; set; }
    public byte[] labels { get; set; }
    //public Array label_types { get; set; }
    public bool success { get; set; }
}

我有这个类来转换数据:

httpresponse

这是转换private LabelResult ConvertLabelResponse(HttpResponseMessage response) { var label_response = new LabelResult(); if (response.IsSuccessStatusCode) { var jsonString = response.Content.ReadAsStringAsync(); jsonString.Wait(); if (jsonString.IsCompleted) { try { var data = JObject.Parse(jsonString.Result); return JsonConvert.DeserializeObject<LabelResult>(data.ToString()); } catch (Exception ex) { return label_response; } } return null; } else { return null; } }

的代码
Header set Access-Control-Allow-Origin "https://www.meetotakus.net"

我有这些错误:

  
      
  1. 读取字节时出现意外的标记:字符串。路径&#39;标签[0]&#39;,第18行,位置10482。

  2.   
  3. 无法创建System.Array类型的实例。 Type是接口或抽象类,无法实例化。路径   &#39; tracking_numbers&#39;,第5行,第23位。

  4.   

如何修复这些错误?

2 个答案:

答案 0 :(得分:3)

你的根模型应该是:

public class LabelResult
{
    public long order_id { get; set; }
    public string order_number { get; set; }
    public string carrier_name { get; set; }
    public List<string> tracking_numbers { get; set; }
    public List<byte []> labels { get; set; }
    public List<string> label_types { get; set; }
    public bool success { get; set; }
}

注意:

  • 如其serialization guide所示,Json.NET会将Base64编码的字符串映射到byte []。您的"labels"属性是此类字符串的数组,因此应绑定到byte [][]List<byte []>

  • 没有理由解析为JObject然后转换回字符串以反序列化:

    var data = JObject.Parse(jsonString.Result);
    return JsonConvert.DeserializeObject<LabelResult>(data.ToString());
    

    而是从结果中反序列化:

    return JsonConvert.DeserializeObject<LabelResult>(jsonString.Result);
    
  • 始终倾向于使用List<string>等类型集合来对ArrayListArray等无类型集合进行无类型处理。此外,System.Array是抽象基类型,因此无法直接实例化。

  • 如果您愿意,可以使用数组而不是列表:

    public string [] tracking_numbers { get; set; }
    public byte [][] labels { get; set; }
    public string [] label_types { get; set; }
    

    我发现可调整大小的集合更方便,所以更喜欢List<T>

示例工作.Net fiddle

答案 1 :(得分:1)

我认为问题是您正在使用Array关键字初始化数组。这可能是错的。 tracking_numbers 可能是字符串数组。 其次,当你读取Json数据时,你必须手动转换你的标签也是不匹配的数组

"Label": ["..."]

如果你想阅读,你必须在初始化时手动或2D阵列。

public byte[][] labels { get; set; }