2016-12-08 87 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 -->}} 
相關問題