Как я могу прочитать json с комментарием с Json.NET

Чтобы установить внешнее расширение в браузер Google Chrome, я пытаюсь обновить хром файл внешнего расширения json. Использование Json.NET кажется легким:

string fileName = "..."; // path to chrome external extension json file

string externalExtensionsJson = File.ReadAllText(fileName);

JObject externalExtensions = JObject.Parse(externalExtensionsJson);

но я получаю Newtonsoft.Json.JsonReaderException:

"Error parsing comment. Expected: *, got /. Path '', line 1, position 1." 

при вызове JObject.Parse, поскольку этот файл содержит:

// This json file will contain a list of extensions that will be included
// in the installer.

{
}

и комментарии не являются частью json (как показано в Как добавить комментарии к выходу Json.NET?).

Я знаю, что я могу удалить комментарии с помощью Regex (Regex для удаления комментариев стиля javascript double slash (//)), но мне нужно переписать json в файл после изменения и соблюдение комментариев может быть хорошим.

Вопрос: Есть ли способ прочитать json с комментариями, не удаляя их и не переписывая их?

Ответы

Ответ 1

Json.NET поддерживает только чтение многострочных комментариев JavaScript, т.е. /* commment */

Обновление: Json.NET 6.0 поддерживает однострочные комментарии

Ответ 2

Немного поздно, но вы всегда можете преобразовать однострочные комментарии в синтаксис многострочного комментария до разбора...

что-то вроде замены...

.*//.*\n

с

$1/*$2*/

...

Regex.Replace(subjectString, ".*//.*$", "$1/*$2*/");

Ответ 3

Если вы застряли в JavascriptSerializer (из пространства имен System.Web.Script.Serialization), я обнаружил, что это работает достаточно хорошо...

private static string StripComments(string input)
{
    // JavaScriptSerializer doesn't accept commented-out JSON, 
    // so we'll strip them out ourselves;
    // NOTE: for safety and simplicity, we only support comments on their own lines, 
    // not sharing lines with real JSON

    input = Regex.Replace(input, @"^\s*//.*$", "", RegexOptions.Multiline);  // removes comments like this
    input = Regex.Replace(input, @"^\s*/\*(\s|\S)*?\*/\s*$", "", RegexOptions.Multiline); /* comments like this */

    return input;
}