2016-11-08 243 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",

相关问题