【问题标题】:Json.Net - Serialize property name without quotesJson.Net - 序列化不带引号的属性名称
【发布时间】:2011-11-25 02:15:39
【问题描述】:

我正在尝试让 Json.Net 序列化不带引号的属性名称,并且发现很难在 Google 上找到文档。我该怎么做?

它在大型 Json 渲染中的很小一部分,所以我更愿意添加一个属性属性,或者覆盖类上的序列化方法。

目前,它呈现如下:

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

我希望让它呈现如下:(hreftype 没有引号)

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

来自班级:

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

【问题讨论】:

  • 那不是有效的 JSON。为什么要这样做?
  • Marcello - 这是为了满足第三方 jQuery 插件的需求,该插件提供这些数据。
  • @Overflew,你不能修复插件以正常使用 JSON 吗?

标签: c# json.net


【解决方案1】:

您还可以尝试使用可以处理任何序列化对象的替换的正则表达式替换,并为您替换引号。

例如:

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"}

我构建了一个工作网络示例here。 正则表达式替换的解释是here

【讨论】:

    【解决方案2】:

    这是可能的,但我建议不要这样做,因为它会产生无效的 JSON,正如 Marcelo 和 Marc 在他们的 cmets 中指出的那样。

    使用 Json.NET 库,您可以按如下方式实现:

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

    当序列化对象时,使用JsonSerializer 类型而不是静态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"}
    

    如果您将 JsonTextWriter 实例的 QuoteName property 设置为 false,则将不再引用对象名称。

    【讨论】:

    • 这对于使用 GraphQL 来说实际上非常方便......让我想知道为什么 GraphQL 的人决定使用无效的 Json。
    • 好吧,我对标准是双引号感到失望。除了过时的概念“它是有效的 javascript,尽管您在属性名称中输入了内容”之外,它使它变得不必要且不可读并且没有添加任何内容。如果标准是:仅对(非常罕见的)特殊情况(或其他转义字符)使用双引号,而不是所有内容,那就太好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多