【问题标题】:How can I remove quotes from serilaized string?如何从序列化字符串中删除引号?
【发布时间】:2016-12-08 22:22:57
【问题描述】:

我需要生成一个 JSON 文档,它将由设备上的 SSI 机制解析。该文档实际上是一个 json 序列化字典。为了简单起见,假设它应该如下所示:

var x = new Dictionary<string,object> 
    { 
    ["A"]=new {x = "<!-- ?A.x -->"},
    ["B"]=new {x = "<!-- ?B.x -->"} 
    };

JsonConvert.SerializeObject(x).Dump();

在 LinqPad 中产生:

{"A":{"x":"<!-- ?A.x -->"},"B":{"x":"<!-- ?B.x -->"}}

但实际上那些“x”字段是数字,当从设备中获取时,它们将包含数字。所以我需要在 C# 端的字符串字段值周围不带引号的情况下序列化这个字典:

{"A":{"x":<!-- ?A.x -->},"B":{"x":<!-- ?B.x -->}}

如何强制 Newtonsoft Json.NET 序列化程序在序列化过程中不对特定字段(不是全部)的值添加引号?

谢谢。

【问题讨论】:

  • {"A":{"x":&lt;!-- ?A.x --&gt;},"B":{"x":&lt;!-- ?B.x --&gt;}} 会是无效的 Json 吗?您不能指望 json 序列化程序产生无效的 json。为什么不自己构建字符串(因为这是字符串而不是 Json)?
  • 为了证明我的观点,将{"A":{"x":&lt;!-- ?A.x --&gt;},"B":{"x":&lt;!-- ?B.x --&gt;}} 放入JsonLint.. Error: Parse error on line 3:{ "A": { "x": },"B":{
  • @Liam:当然,这种形式的 JSON 是无效的。我从没有说过。但是在设备处理它之后将有效,方法是将 部分替换为数字。我知道这有点让人厌烦正常的工作方式。
  • 你错过了我的观点,你不能指望 json 序列化程序产生无效的 json。如果你想要这种格式,你需要自己制作,而不是使用 Json.Net
  • 我完全明白你的意思。但正如你所看到的,我仍然可以实现它。我为什么要重新发明轮子?

标签: c# json json.net


【解决方案1】:

一种方法是引入新的JsonConverter(sample)。为了分离“原始序列化”的功能,您可以引入仅包装字符串值的新类型,例如。

public class RawJson
{
    public string Value { get; private set; }

    public RawJson(string value)
    {
        Value = value;
    }
}

然后你只需在转换器的CanConvert() 和WriteJson() 中检查这种类型,你可以写

writer.WriteRawValue(((RawJson)value).Value);

【讨论】:

  • 你给了我路径,但解决方案更简单。好的,我的例子不够好,因为我没有使用匿名类,但我已经声明了它们。我接受你的回答,但我将在下面发布最终版本。
【解决方案2】:

下面是实际的解决方案,基于@kiziu 使用自定义转换器的建议。但没有自定义类型。由于转换器也可以将属性添加到成员中,而不仅仅是类或转换器本身,我可以在我需要的属性上使用它。上面的 LinqPad 临时更新:

internal class RawJsonConverter : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            return objectType == typeof(string);
        }

        public override bool CanRead
        {
            get { return false; }
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            throw new NotImplementedException();
        }

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            writer.WriteRawValue((string)value);
        }
    }

class myClass 
{
    [JsonConverter(typeof(RawJsonConverter))]
    public string x;
}

void Main()
{
    var x = new Dictionary<string,object> 
        { 
        ["A"]=new myClass {x = "<!-- ?A.x -->"},
        ["B"]=new myClass {x = "<!-- ?B.x -->"} 
        };


    JsonConvert.SerializeObject(x).Dump();
}

结果如预期的那样:

{"A":{"x":<!-- ?A.x -->},"B":{"x":<!-- ?B.x -->}}

【讨论】:

    猜你喜欢
    • 2020-09-03
    • 2022-01-01
    • 2011-05-12
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多