2016-11-08 245 views
0

我有一個令人沮喪的問題,我無法解決。我正在使用Newtonsoft.Json來反序列化一些.json數據。我可以在原始JSON串清楚地看到,有字符序列使用JsonConvert.DeserializeObject(Newtonsoft.Json)進行反序列化時丟失不可打印的ascii字符(組分隔符)

{ '\\', 'u', '0', '0', '1', 'd' } 

這表示「基團分隔符」(ASCII 29或0x1D)。但是,當我使用JsonConvert.DeserializeObject<>進行反序列化時,這些字符序列未正確放入其對象中。什麼是放置,而不是簡單的一維。也就是說,如果你看一下字符數組,你看:

29 '\u001d'

的6個不同的角色已被替換1.

沒有人知道爲什麼這件事會發生?我在下面列出了一個測試程序。不幸的是,它的行爲完全如我所料。也就是說,6個字符顯示在對象字段「說明」中。顯然,我錯過了一些東西,並沒有捕獲到實際的問題,我意識到應該儘可能努力地想出一個能夠在大量代碼中複製問題的小程序。不幸的是,我會空白。所以,我在尋求什麼和如何可能發生的建議。什麼會在反序列化中做這個替換?實際的對象比我的坦克例子更復雜,但坦克中有IEnumerable的想法。

非常感謝, 戴夫

class Program 
{ 
    static void Main(string[] args) 
    { 
     JsonSerializerSettings settings = new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }; 
     Tank tank1 = new Tank(); 
     char[] array1 = new char[] { '1', '2', '\\', 'u', '0', '0', '1', 'd', '3', '4' }; 
     tank1.Description = new string(array1);   
     tank1.Id = 1; 
     Console.WriteLine("Original string (showing hidden characters"); 
     for (int i = 0; i < tank1.Description.ToArray().Length; i++) 
     { 
      Console.Write(tank1.Description.ToArray()[i] + " "); 
     } 
     Console.WriteLine(); 

     string conversion1 = JsonConvert.SerializeObject(tank1); 

     Tank deserializedTank1 = JsonConvert.DeserializeObject<Tank>(conversion1, settings); 


     Console.WriteLine("Deserialized string (showing hidden characters"); 
     for (int i = 0; i < deserializedTank1.Description.ToArray().Length; i++) 
     { 
      Console.Write(deserializedTank1.Description.ToArray()[i] + " "); 
     } 
     Console.WriteLine(); 


     Tank tank2 = new Tank() { Id = 2 }; 
     tank2.Description = new string(array1); 
     Tank tank3 = new Tank() { Id = 3 }; 
     tank3.Description = new string(array1); 

     Tanks tanks = new Tanks(); 
     tanks.Group = new [] { tank1, tank2, tank3}; 
     string tanksSerializedString = JsonConvert.SerializeObject(tanks,Formatting.Indented,settings); 

     Tanks deserializedTanks = JsonConvert.DeserializeObject<Tanks>(tanksSerializedString, settings); 

     Console.WriteLine("Deserialized Tanks"); 
     foreach (Tank tank in deserializedTanks.Group) 
     { 
      Console.WriteLine("Deserialized string (showing hidden characters"); 
      for (int i = 0; i < tank.Description.ToArray().Length; i++) 
      { 
       Console.Write(tank.Description.ToArray()[i] + " "); 
      } 
      Console.WriteLine(); 
     } 
    } 
} 

interface ITank 
{ 
    int Id { get; set; } 
    string Description { get; set; } 
} 
public class Tank : ITank 
{ 
    public Tank() { } 
    public string Description { get; set; } 
    public int Id { get; set; } 
} 

public class Tanks 
{ 
    public Tanks() { } 
    public IEnumerable<Tank> Group { get; set; } 
} 
+2

根據[JSON標準](http://www.json.org/),'\ u四位十六進制數字'表示一個(utf16)unicode字面值。所以這聽起來像序列化器的行爲如預期。如果你不想這樣,那麼'\'字符必須被轉義:「\\ u001d」。 – dbc

+0

感謝dbc。這就說得通了。我研究了一些更多的問題,並認爲它保證了一個單獨的問題(http://stackoverflow.com/questions/40486715/how-to-send-group-separator-non-printable-ascii-characters-with-restsharp-rest) 。我相信我的問題是如何RestSharp序列化我的對象。作爲答案,我會如此標記,如果你想。 – Dave

回答

0

預期的串行器行爲。按照JSON Standard,字符串中的字符模式的序列\u four-hex-digits表示單個(UTF-16)Unicode字符文字,組分隔符爲\u001d

JSON standard for strings

如果你不希望出現這種情況,該\字符必須在字符串中轉義:"\\u001d",

相關問題