使用JsonConvert.DeserializeObject(Newtonsoft.Json)反序列化时丢失不可打印的ascii字符(组分隔符)

时间:2016-11-08 02:23:08

标签: c# json json.net escaping ascii

我有一个令人沮丧的问题,我无法解决。我正在使用Newtonsoft.Json反序列化一些.json数据。我可以在原始的json字符串中清楚地看到有字符序列

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

这表示“组分隔符”(ascii 29或0x1D)。但是,当我使用JsonConvert.DeserializeObject<>反序列化时,这些字符序列未正确放入其对象中。相反,只需1D就可以了。那就是你看一下你看到的字符数组:

29 '\u001d'

6个单独的字符已被1替换。

有谁知道为什么会发生这种情况?我在下面列出了一个测试程序。不幸的是,它的表现完全符合我的预期。也就是说,6个字符显示在对象字段“描述”中。很明显,我错过了一些东西而没有捕获到那个实际问题,我意识到应该尽可能地努力想出一个小程序来复制大量代码中的问题。不幸的是,我空白了。所以,我正在寻求关于寻找什么以及如何可能发生的建议。在反序列化中如何替换?实际的对象比我的Tanks例子更复杂,但是在Tanks中有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; }
}

1 个答案:

答案 0 :(得分:0)

序列化程序的行为符合预期。根据{{​​3}},模式\u four-hex-digits中的一系列字符表示单个(utf16)Unicode字符文字,\u001d的组分隔符:

JSON Standard

如果您不想这样,则必须在字符串中转义\字符:"\\u001d"