У меня есть этот код, чтобы попытаться открыть файл .json и прочитать его:

[Route("{unit}/{begindate}")]
public string Get(string unit, string begindate)
{
    string _unit = unit;
    string _begindate = String.Format("{0}01", PlatypusWebReportsConstsAndUtils.HyphenizeYYYYMM(begindate));           
    string appDataFolder = HttpContext.Current.Server.MapPath("~/App_Data/");
    // semi-hardcoded file name for now
    string jsonFilename = string.Format("PoisonToe_{0}_{1}.json", _unit, _begindate);
    string fullPath = Path.Combine(appDataFolder, jsonFilename);
    JObject platypusComplianceJson = JObject.Parse(File.ReadAllText(fullPath));
    . . .

В последней строке я получаю:

Исключение Newtonsoft.Json.JsonReaderException не было обработано кодом пользователя HResult = -2146233088 Сообщение = Ошибка чтения JObject из JsonReader. Текущий элемент JsonReader не является объектом:

Основываясь на том, что я прочитал здесь, я подумал, что это будет способ сделать это. Что я делаю не так?

B. Clay Shannon

Ответов: 1

Ответы (1)

Трудно дать лучший ответ без информации, запрошенной в комментариях, но это означает, как предполагается, что текущий токен не является началом объекта.

Для ясности, мы говорим об «объекте» в словаре JSON, а не в смысле словаря C # / ООП.

Похоже, что здесь происходит что-то вроде не-JSON bool.Parse ("1"). Да, "1" является допустимым вводом для метода синтаксического анализа (например,int.Parse), но это неправильный метод.

Простой трюк (предупреждение: Band-Aid fix) - переключиться на JToken.Parse.JToken является полиморфным родителем JObject, JArray, JValueи лота, поэтому его синтаксический анализ может обрабатывать намного больше типы неструктурированного ввода.

Прежде чем вы это сделаете, я уверен, вы знаете, что вам следует дважды проверить свои контракты и файл, чтобы увидеть, что не так. Конечно, нет ничего хорошего в успешном анализе JArray, который вы затем используете как JObject.

Для удобства, несколько текстов файлов, которые могут вызвать эту ошибку:

  • (пустой файл)
  • [{"test": "val"}] (массив)
  • "тест" (строка)
  • ноль

Все они должны быть допустимыми входами для JToken.Parse, я полагаю, но все они выдали бы эту ошибку на JObject.Parse, потому что они не являются объектами. Вам нужно что-то вроде:

  • {"test": "val"}
  • {"test": {"val": 2}}

Или что-то в этом роде.


Вернемся к моей точке ООП, JObject не является элементарным базовым типом всего в JSON.net, а JToken является. Итак, даже если вы могли бы сказать:

object i = new int[0];

в C # нельзя сказать

JObject i = JObject.Parse("[0, 0, 0]");

в JSON.net.

2022 WebDevInsider