Newtonsoft.Json.JsonTextReader 解析值后遇到意外字符:
Newtonsoft.Json.JsonTextReader After parsing a value an unexpected character was encountered:
我正在尝试将 HTTP 响应内容反序列化为已知模型。
响应包含一个名为 'schemaFields' 的字段,它是 json 对象的字符串表示形式。
尝试调用 replace 不会改变结果 > httpRespContent.Replace(@"\", "");
序列化失败,出现以下错误:
After parsing a value an unexpected character was encountered: m. Path
'schemaFields', line 1, position 19.
调用堆栈:
at Newtonsoft.Json.JsonTextReader.ParsePostValue(Boolean ignoreComments)
at Newtonsoft.Json.JsonTextReader.Read()
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings)
at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings)
型号:
public class GetOrganizationResponse : PlainIdResponse
{
[JsonProperty("status")]
public string Status { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("bpid")]
public string Bpid { get; set; }
[JsonProperty("id")]
public string Id { get; set; }
[JsonProperty("description")]
public string Description { get; set; }
[JsonProperty("source")]
public string Source { get; set; }
[JsonProperty("type")]
public string Type { get; set; }
[JsonProperty("schemaFields")]
public string SchemaFields { get; set; }
[JsonProperty("lastUpdateTime")]
public string LastUpdateTime;
}
使用Newtonsoft.Json,版本=12.0.0.0.
输入代码:
const string schemaFields =
"{\"main\":{\"city\":[\"city\"],\"state\":[\"state\"],\"country\":[\"country\"],\"zip_code\":[\"\"],\"street_address\":[\"streetAddress\"]},\"system\":{\"name\":[\"orgNameWithSamlDataAndOrganization1\"],\"type\":[\"CUSTOMER\"],\"status\":[\"APPROVED\"],\"description\":[\"description\"],\"member_limit\":[-1]}}";
string httpRespContent = $"{{\"schemaFields\":\"{schemaFields}\", \"versionId\":\"1615130797664\",\"bpid\":\"bpidWithSamlDataAndOrganization1\",\"name\":\"orgNameWithSamlDataAndOrganization1\",\"createdTime\":\"1615130797664\",\"description\":\"description\",\"id\":\"b14b9595-f15b-4bf3-b139-1429f8c51040\",\"source\":\"\",\"requesterFields\":\"\",\"type\":\"CUSTOMER\",\"status\":\"APPROVED\",\"lastUpdateTime\":\"1615130797664\"}}";
try
{
var orgResp = JsonConvert.DeserializeObject<GetOrganizationResponse>(httpRespContent);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
很遗憾,我无法更改输入,这是来自远程服务的响应。
我在这里错过了什么?
我认为您需要使用转义反斜杠来转义双引号,这会使您的 schemaFields 看起来像
"{\\"main\\":{\\"city\\":[\\"cit...
我正在尝试将 HTTP 响应内容反序列化为已知模型。
响应包含一个名为 'schemaFields' 的字段,它是 json 对象的字符串表示形式。
尝试调用 replace 不会改变结果 > httpRespContent.Replace(@"\", "");
序列化失败,出现以下错误:
After parsing a value an unexpected character was encountered: m. Path 'schemaFields', line 1, position 19.
调用堆栈:
at Newtonsoft.Json.JsonTextReader.ParsePostValue(Boolean ignoreComments)
at Newtonsoft.Json.JsonTextReader.Read()
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings)
at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings)
型号:
public class GetOrganizationResponse : PlainIdResponse
{
[JsonProperty("status")]
public string Status { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("bpid")]
public string Bpid { get; set; }
[JsonProperty("id")]
public string Id { get; set; }
[JsonProperty("description")]
public string Description { get; set; }
[JsonProperty("source")]
public string Source { get; set; }
[JsonProperty("type")]
public string Type { get; set; }
[JsonProperty("schemaFields")]
public string SchemaFields { get; set; }
[JsonProperty("lastUpdateTime")]
public string LastUpdateTime;
}
使用Newtonsoft.Json,版本=12.0.0.0.
输入代码:
const string schemaFields =
"{\"main\":{\"city\":[\"city\"],\"state\":[\"state\"],\"country\":[\"country\"],\"zip_code\":[\"\"],\"street_address\":[\"streetAddress\"]},\"system\":{\"name\":[\"orgNameWithSamlDataAndOrganization1\"],\"type\":[\"CUSTOMER\"],\"status\":[\"APPROVED\"],\"description\":[\"description\"],\"member_limit\":[-1]}}";
string httpRespContent = $"{{\"schemaFields\":\"{schemaFields}\", \"versionId\":\"1615130797664\",\"bpid\":\"bpidWithSamlDataAndOrganization1\",\"name\":\"orgNameWithSamlDataAndOrganization1\",\"createdTime\":\"1615130797664\",\"description\":\"description\",\"id\":\"b14b9595-f15b-4bf3-b139-1429f8c51040\",\"source\":\"\",\"requesterFields\":\"\",\"type\":\"CUSTOMER\",\"status\":\"APPROVED\",\"lastUpdateTime\":\"1615130797664\"}}";
try
{
var orgResp = JsonConvert.DeserializeObject<GetOrganizationResponse>(httpRespContent);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
很遗憾,我无法更改输入,这是来自远程服务的响应。
我在这里错过了什么?
我认为您需要使用转义反斜杠来转义双引号,这会使您的 schemaFields 看起来像
"{\\"main\\":{\\"city\\":[\\"cit...