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...