Json.NET в настоящее время не поддерживает строгий анализ имен свойств JSON.
Внутренне JToken.Parse()
создает JsonTextReader
для анализа строки JSON, и она появляется возможность JsonTextReader
анализировать имена свойств без кавычек в настоящее время не может быть отключена.
При итерации файла JSON через JsonTextReader.Read()
метод JsonTextReader.ParseProperty()
используется для анализа имен свойств:
Newtonsoft.Json.JsonTextReader.ParseUnquotedProperty()
Newtonsoft.Json.JsonTextReader.ParseProperty()
Newtonsoft.Json.JsonTextReader.ParseObject()
Newtonsoft.Json.JsonTextReader.Read()
Newtonsoft.Json.Linq.JContainer.ReadTokenFrom()
И, как видно из справочника, source, этот метод автоматически обрабатывает свойства, заключенные в двойные, одинарные и не заключенные в кавычки:
private bool ParseProperty()
{
char firstChar = _chars[_charPos];
char quoteChar;
if (firstChar == '"' || firstChar == '\'')
{
_charPos++;
quoteChar = firstChar;
ShiftBufferIfNeeded();
ReadStringIntoBuffer(quoteChar);
}
else if (ValidIdentifierChar(firstChar))
{
quoteChar = '\0';
ShiftBufferIfNeeded();
ParseUnquotedProperty();
}
else
{
throw JsonReaderException.Create(this, "Invalid property identifier character: {0}.".FormatWith(CultureInfo.InvariantCulture, _chars[_charPos]));
}
// REMAINDER OMITTED
Как видите, нет возможности настроить средство чтения для выдачи исключения для свойств без двойных кавычек.
В качестве обходного пути текущий Json лицензия позволяет копировать и изменять. Таким образом, вы сможете создать свой собственный public class StricterJsonTextReader : JsonReader
, скопированный из JsonTextReader
, и изменить ParseProperty()
следующим образом:
private bool ParseProperty()
{
char firstChar = _chars[_charPos];
char quoteChar;
if (firstChar == '"')
{
_charPos++;
quoteChar = firstChar;
ShiftBufferIfNeeded();
ReadStringIntoBuffer(quoteChar);
}
else
{
// JsonReaderException.Create() is an internal static method,
// so you will need to replace this with some extension method
throw JsonReaderException.Create(this, "Invalid property identifier character: {0}.".FormatWith(CultureInfo.InvariantCulture, _chars[_charPos]));
}
Однако это может оказаться не совсем простой задачей, поскольку JsonTextReader
широко использует утилиты из _ 13_. Вы должны выделить пару дней на создание минимальной копии необходимых утилит.
В качестве альтернативы вы можете создать собственную версию Json.NET, собрать ее самостоятельно и использовать вместо официальной версии. В любом случае не забудьте разветвить исходный код той версии, которую хотите использовать:
В качестве альтернативы созданию собственного анализатора вы можете предварительно обработать свой JSON с помощью _ 14_, чтобы обеспечить строгое соответствие стандарту JSON:
public static class JsonExtensions
{
public static JToken StrictParse(string json)
{
try
{
// Throw an exception if the json string is not in strict compliance with the JSON standard
// by tokenizing it with the JSON reader used by DataContractJsonSerializer:
using (var stream = GenerateStreamFromString(json))
using (var reader = System.Runtime.Serialization.Json.JsonReaderWriterFactory.CreateJsonReader(stream, System.Xml.XmlDictionaryReaderQuotas.Max))
{
while (reader.Read())
{
}
}
}
catch (Exception ex)
{
// Wrap the XmlException in a JsonReaderException
throw new JsonReaderException("Invalid JSON", ex);
}
// Then actually parse with Json.NET
return JToken.Parse(json);
}
static MemoryStream GenerateStreamFromString(string value)
{
return new MemoryStream(Encoding.UTF8.GetBytes(value ?? ""));
}
}
(Вам нужно будет добавить ссылку на соответствующую сборку .Net для вашей платформы.)
Производительность будет хуже, так как вы будете дважды анализировать свой JSON, но усилия по реализации тривиальны.
Как ни странно, я не смог использовать JavaScriptSerializer
для проверки строгого соответствия JSON, потому что он также принимает имена свойств без кавычек!
// The following does not throw an exception:
new System.Web.Script.Serialization.JavaScriptSerializer().DeserializeObject("{foo : 'bar'}")
Ссылки по теме:
Отключить поддержку чтения (недопустимого JSON) строк с одинарными кавычками, для чего нужно создать свой собственный JsonReader
.
Имя свойства json без кавычек, на которое нет ответа.
Проблема № 646. Поддержка «строгого режима» для синтаксического анализа RFC7159 < / em>, который был закрыт JamesNK. В ветке обсуждения перечислены различные способы JsonTextReader
расширения стандарта JSON, а также некоторые причины, по которым Newtonsoft еще не реализовал строгий синтаксический анализатор.
Несмотря на то, что проблема была закрыта, вы, безусловно, можете добавить комментарий с просьбой о строгом синтаксическом анализе. Конечно, это похоже на то, что они должны предоставить.
person
dbc
schedule
14.11.2018
JsonTextReader
, чтобы делать то, что вам нужно? - person dbc   schedule 14.11.2018