解析 API 响应时遇到意外字符

Posted

技术标签:

【中文标题】解析 API 响应时遇到意外字符【英文标题】:Unexpected character encountered while parsing API response 【发布时间】:2019-01-26 06:05:24 【问题描述】:

我遇到了这个异常:

Newtonsoft.Json.JsonReaderException H结果=0x80131500 消息=解析值时遇到意外字符:。路径“outputObject.address”,第 17 行,位置 16。

从 API 反序列化响应数据时。 (帖子末尾的完全例外)

代码

return JsonConvert.DeserializeObject(webResponseEntity.ResponseData, typeof(CarLookupResponse)) as CarLookupResponse;

型号

   public class CarLookupResponse : ICarLookupResponse
    
        public ICarLookupResult Result  get; set; 

        public ICarLookupOutputObject OutputObject  get; set; 

        public CarLookupResponse()
        
            Result = new CarLookupResult();
            OutputObject = new CarLookupOutputObject();
        
    

以下是输出对象接口 OutputObject 接口

public interface ICarLookupOutputObject 
    
        int  CarId  get; set; 

        string CartestId  get; set; 

        int[] ModelYears  get; set; 

        string FirstName  get; set; 

        string LastName  get; set; 

        string Email  get; set; 

        string SSN  get; set; 

        string Address  get; set; 
    

JSON

   
     "result": 
        "id": 1,
        "value": "lookup successful.",
        "error": null
      ,
      "outputObject": 
        "CarId": 2025,
        "CartestId": "testing-02",
        "ModelYears": [
          2017,
          2018
        ],
        "firstName": "Troy",
        "lastName": "Aaster",
        "email": "testuser@gmail.com",
        "address": 
          "apartment": "",
          "state": "CA",
          "city": "BRISBANE",
          "zipCode": "94005",
          "streetAddress": "785, SPITZ BLVD"
        ,
        "ssn": "511-04-6666"
      
    

我试图找到这个异常的原因,但无法得到它,JSON是有效的,我已经检查过了。

以下是完整的异常详情

Newtonsoft.Json.JsonReaderException H结果=0x80131500 消息=解析值时遇到意外字符:。路径“outputObject.address”,第 17 行,位置 16。 来源=Newtonsoft.Json 堆栈跟踪: 在 Newtonsoft.Json.JsonTextReader.ReadStringValue(ReadType readType) 在 Newtonsoft.Json.JsonTextReader.ReadAsString() 在 Newtonsoft.Json.JsonReader.ReadForType(JsonContract 合同,布尔 hasConverter) 在 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(对象 newObject,JsonReader 阅读器,JsonObjectContract 合同,JsonProperty 成员,字符串 id) 在 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader 阅读器,类型 objectType,JsonContract 合同,JsonProperty 成员,JsonContainerContract containerContract,JsonProperty containerMember,对象现有值) 在 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.SetPropertyValue(JsonProperty 属性,JsonConverter propertyConverter,JsonContainerContract containerContract,JsonProperty containerProperty,JsonReader 阅读器,对象目标) 在 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(对象 newObject,JsonReader 阅读器,JsonObjectContract 合同,JsonProperty 成员,字符串 id) 在 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader 阅读器,类型 objectType,JsonContract 合同,JsonProperty 成员,JsonContainerContract containerContract,JsonProperty containerMember,对象现有值) 在 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader 阅读器,类型 objectType,布尔 checkAdditionalContent) 在 Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader 阅读器,类型 objectType) 在 Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings 设置)

【问题讨论】:

可能outputObject.address绑定的c#属性是字符串,而不是复杂对象? @dbc 是地址是字符串 如果没有CarLookupOutputObject 我不能肯定地说,但是由于异常是从Newtonsoft.Json.JsonTextReader.ReadAsString() 抛出的,所以CarLookupOutputObject.Address 很可能是一个字符串而不是一个对象,这将导致异常。 @dbc 是的,它是一个字符串,我用同样的方法编辑了我的问题,请检查 是的,就是这样。诸如 "CarId": 2025 之类的 JSON 对象不能反序列化为原始字符串。见newtonsoft.com/json/help/html/serializationguide.htm#Objects 【参考方案1】:

您的问题是您已将CarLookupOutputObject.Address 声明为string,但对应的JSON 值是一个对象:

"address": 
  "apartment": "",
  ...
,

正如Serialization Guide 中所述,只有原始 .Net 类型和可转换为 string 的类型被序列化为 JSON 字符串。因为"address" 的值不是原始的,所以抛出异常。

相反,按照http://json2csharp.com/ 的建议修改您的数据模型:

public class CarLookupOutputObject 

    public Address address  get; set; 

    // Remainder unchanged


public class Address

    public string apartment  get; set; 
    public string state  get; set; 
    public string city  get; set; 
    public string zipCode  get; set; 
    public string streetAddress  get; set; 

【讨论】:

以上是关于解析 API 响应时遇到意外字符的主要内容,如果未能解决你的问题,请参考以下文章

mobileserviceclient loginasync“解析值时遇到意外字符:

Blazor - app.UseIdentityServer();使用 .pfx 密钥文件 - 解析数字时遇到意外字符

GraphQLError:语法错误:无法解析意外字符“\u00A0”

使用 Nodejs Sharp 模块时出错。模块解析失败:意外字符 '' (1: 0)

GraphQLError:语法错误:无法解析意外字符“;” [关闭]

API 版本 2:无法解析带有“INVALID_ARGUMENT”错误的 JSON 响应字符串:\“:找不到字段。\”