Json.Net - сериализовать имя свойства без кавычек

Я пытаюсь заставить Json.Net сериализовать имя свойства без кавычек, и мне трудно найти документацию в Google. Как я могу это сделать?

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

В настоящее время это выглядит так:

"event_modal":
{
    "href":"file.html",
    "type":"full"
}

И я надеюсь, что это будет выглядеть так: (href и type без кавычек)

"event_modal":
{
    href:"file.html",
    type:"full"
}

Из класса:

public class ModalOptions
{
    public object href { get; set; }
    public object type { get; set; }
}

person Overflew    schedule 26.09.2011    source источник
comment
Это недопустимый JSON. почему ты хочешь сделать это?   -  person Marcelo Cantos    schedule 26.09.2011
comment
См. в JSON, Почему цитируется каждое имя?   -  person Marc Gravell    schedule 26.09.2011
comment
Марчелло - это для удовлетворения потребностей стороннего плагина jQuery, который обрабатывает эти данные.   -  person Overflew    schedule 26.09.2011
comment
@Overflew, ты не можешь исправить плагин для правильной работы с JSON?   -  person svick    schedule 26.09.2011


Ответы (2)


Это возможно, но я не рекомендую этого, так как это приведет к недействительному JSON, как отметили в своих комментариях Марсело и Марк.

Используя библиотеку Json.NET, вы можете добиться этого следующим образом:

[JsonObject(MemberSerialization.OptIn)]
public class ModalOptions
{
    [JsonProperty]
    public object href { get; set; }

    [JsonProperty]
    public object type { get; set; }
}

При сериализации объекта используйте тип JsonSerializer вместо статического < тип href = "http://james.newtonking.com/projects/json/help/html/T_Newtonsoft_Json_JsonConvert.htm" rel = "noreferrer"> JsonConvert.

Например:

var options = new ModalOptions { href = "file.html", type = "full" };
var serializer = new JsonSerializer();
var stringWriter = new StringWriter();
using (var writer = new JsonTextWriter(stringWriter))
{
    writer.QuoteName = false;
    serializer.Serialize(writer, options);            
}
var json = stringWriter.ToString();

Это произведет:

{href:"file.html",type:"full"}

Если вы установите для свойства QuoteName экземпляра JsonTextWriter значение false, имена объектов больше не будут заключаться в кавычки.

person Christophe Geers    schedule 26.09.2011
comment
На самом деле это очень удобно для работы с GraphQL ... заставляет меня удивляться, почему ребята из GraphQL решили работать с недопустимым Json. - person Eric; 02.11.2018
comment
Что ж, меня на этот раз разочаровало, что в стандарте используются двойные кавычки. Это делает его ненужным, нечитаемым и ничего не добавляет, кроме устаревшей концепции «это действительный javascript, несмотря на то, что вы указали в имени свойства». Было бы здорово, если бы стандарт был таким: используйте двойные кавычки только для (действительно редких) особых случаев (или какой-либо другой escape-символ) вместо всего. - person Dirk Boer; 24.02.2019

Вы также можете попробовать заменить регулярное выражение с заменой, которая может обрабатывать любой сериализованный объект и заменять кавычки за вас.

Например:

var options = new ModalOptions { href = "file.html", type = "full" };
string jsonText = JsonConvert.SerializeObject(options);
string regexPattern = "\"([^\"]+)\":"; // the "propertyName": pattern
Console.WriteLine(Regex.Replace(jsonText, regexPattern, "$1:"));

Это даст:

{href:"file.html",type:"full"}

Я создал рабочий веб-пример здесь. Объяснение замен регулярных выражений можно найти здесь .

person BrokeSoftwareEngineer    schedule 19.08.2019