41

I'm trying to get Json.Net to serialise a property name without quote marks, and finding it difficult to locate documentation on Google. How can I do this?

It's in a very small part of a large Json render, so I'd prefer to either add a property attribute, or override the serialising method on the class.

Currently, the it renders like this:

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

And I'm hoping to get it to render like: (href and type are without quotes)

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

From the class:

public class ModalOptions
{
    public object href { get; set; }
    public object type { get; set; }
}
Julian
  • 30,223
  • 19
  • 105
  • 147
Overflew
  • 7,532
  • 9
  • 43
  • 63

2 Answers2

53

It's possible, but I advise against it as it would produce invalid JSON as Marcelo and Marc have pointed out in their comments.

Using the Json.NET library you can achieve this as follows:

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

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

When serializing the object use the JsonSerializer type instead of the static JsonConvert type.

For example:

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();

This will produce:

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

If you set the QuoteName property of the JsonTextWriter instance to false the object names will no longer be quoted.

Christophe Geers
  • 7,827
  • 3
  • 35
  • 49
  • 4
    This is actually very handy for working with GraphQL...makes my wonder why the GraphQL guys decided to work with invalid Json. – Eric Nov 01 '18 at 21:15
  • 2
    well, me for once am disappointed that the standard is with double quotes. It makes it unnecessary unreadable and adds nothing, except the outdated concept 'it is valid javascript despite what you put in the property name'. It would have been great if the standard would have been: use double quotes only for the (really rare) special cases (or some other escape character) instead of everything. – Dirk Boer Feb 24 '19 at 12:16
4

You can also try a regex replace, with a substitution, which could handle any serialized object, and replace the quotes for you.

For Example:

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:"));

This would produce:

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

I built a working web example here. Explanation of regex substitutions are here.