Я отправляю запрос к API и могу проанализировать результат ответа успех(response.Content.ReadAsStringAsync().Result), но когда я получаю ответ отказ («неверный запрос»), кажущийся правильно сформированным результат JSON не может быть проанализирован JObject.Parse() или JToken.Parse(), они бросают.
using System;
using Newtonsoft.Json.Linq;
public class Program
{
public static void Main()
{
var result = "\"{\\\"error\\\":{\\\"detail\\\":\\\"java.lang.NullPointerException\\\",\\\"message\\\":\\\"Error occured while setting field 'caller_id' with value null\\\"},\\\"status\\\":\\\"failure\\\"}\"";
var jObject = JObject.Parse(result);
Console.WriteLine(jObject["error"]["message"]);
}
}
Исключение:
Run-time exception (line 10): Error reading JObject from JsonReader. Current JsonReader item is not an object: String. Path '', line 1, position 162.
Трассировки стека:
[Newtonsoft.Json.JsonReaderException: Error reading JObject from JsonReader. Current JsonReader item is not an object: String. Path '', line 1, position 162.] at Newtonsoft.Json.Linq.JObject.Load(JsonReader reader, JsonLoadSettings settings) at Newtonsoft.Json.Linq.JObject.Parse(String json, JsonLoadSettings settings) at Newtonsoft.Json.Linq.JObject.Parse(String json) at Program.Main() :line 10
Исключение указывает на самый конец строки, но я не могу понять, чего не хватает. https://jsonblob.com может разобрать его после того, как я удалю обратную косую черту, я избавился от апострофа, я «очистил его» с заменой строки и регулярного выражения, я превратил в массив символов и снова построил его, все безрезультатно.
Помощь приветствуется!
Это то, что возвращается из запроса, я предполагаю, что С# убегает немного больше.





Когда я консолью, пишу вашу строку json, которая:
var result = "\"{\\\"error\\\":{\\\"detail\\\":\\\"java.lang.NullPointerException\\\",\\\"message\\\":\\\"Error occured while setting field 'caller_id' with value null\\\"},\\\"status\\\":\\\"failure\\\"}\"";
он возвращает:
"{\"error\":{\"detail\":\"java.lang.NullPointerException\",\"message\":\"Error occured while setting field 'caller_id' with value null\"},\"status\":\"failure\"}"
Что не является правильной строкой json. Ваша строка json должна быть такой, как показано ниже:
var result = "{\"error\":{\"detail\":\"java.lang.NullPointerException\",\"message\":\"Error occured while setting field 'caller_id' with value null\"},\"status\":\"failure\"}"
Так что, когда вы напишете этот оператор в консоли, вы увидите, что он генерирует строку ниже, которая является правильно сформированным json:
{"error":{"detail":"java.lang.NullPointerException","message":"Error occured while setting field 'caller_id' with value null"},"status":"failure"}
Предоставленная вами строка имеет правильный формат JSON. Это то, что вы получите, если сериализуете некоторые данные в строку JSON а затем сериализовать эту строку в строку JSON. Поэтому, чтобы получить данные из исходной строки JSON, вам нужно дважды проанализировать ее.
Для меня работает следующее:
var jToken = JToken.Parse(result);
var jObject = JObject.Parse((string)((JValue)jToken).Value);
Console.WriteLine(jObject["error"]["message"]);
Я бы и за миллион лет не догадался, спасибо!
Почему у вас так много косых черт в вашей строке? Я успешно запустил ваш код с этой строкой
var result = "{\"error\":{\"detail\":\"java.lang.NullPointerException\",\"message\":\"Error occured while setting field 'caller_id' with value null\"},\"status\":\"failure\"}";.