2016-12-08 83 views
0

我需要生成一个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串行不要引号添加到特定字段的值(不是全部)在序列化?

谢谢。

+0

'{ “A”:{ “×”:}, “B”:{ “×”: }}'Json会无效吗?你不能指望一个JSON序列化器产生无效的JSON。你为什么不自己建立字符串(因为这是一个字符串,而不是Json)? – Liam

+0

为了证明我的观点,把'{“A”:{“x”:},“B”:{“x”:}}'放入[JsonLint](http://jsonlint.com/)错误:第3行解析错误:{“A”:{\t“x”:},“B”:{' – Liam

+0

@Liam:当然,这种形式的JSON无效。我从没有说过。但是在设备处理完成后,通过用数字替换部分将会生效。我知道这是围绕正常的工作方式而开始的。 – ZorgoZ

回答

0

一种方法是通过引入新的JsonConverter(sample)。要分离“原始序列化”的功能,你可以引入一个新的类型,它只是包装一个字符串值,例如。

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

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

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

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

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

0

而且下面是实际的解决方案的基础上,@ 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 -->}} 
相关问题