解析 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)