Ответ 1
Json.NET поддерживает только чтение многострочных комментариев JavaScript, т.е. /* commment */
Обновление: Json.NET 6.0 поддерживает однострочные комментарии
Чтобы установить внешнее расширение в браузер 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 с комментариями, не удаляя их и не переписывая их?
Json.NET поддерживает только чтение многострочных комментариев JavaScript, т.е. /* commment */
Обновление: Json.NET 6.0 поддерживает однострочные комментарии
Немного поздно, но вы всегда можете преобразовать однострочные комментарии в синтаксис многострочного комментария до разбора...
что-то вроде замены...
.*//.*\n
с
$1/*$2*/
...
Regex.Replace(subjectString, ".*//.*$", "$1/*$2*/");
Если вы застряли в 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;
}