关于LitJson中文的问题

来源:互联网 发布:千人千面 淘宝 编辑:程序博客网 时间:2024/06/06 19:38

LitJson是一个非常不错的,在.net下处理Json的开源库。对她的赞美之词,此处省略1000行。。

但在项目中遇到了一个比较别扭的问题,就是利用LitJson序列化对象时,中文字符被处理为Unicode码,成为一个个\uXXXX类型的字符串。

本来想在将Json反序列化成对象时,将Unicode码重新转换为中文(这种方法网上例子较多),但总觉得很2....

于是,简单的研究了下LitJson的代码,找到了其中的奥义。原来作者在处理对象的property 和 value时,充分考虑到了转义字符,通过读取字符串中的每一个字符,并判断其所属的类型,来分别进行不同类别的输入。如下:

在JsonMapper类中的810行:

        public static string ToJson (object obj)

        {
                lock (static_writer_lock) {
                static_writer.Reset ();

                WriteValue (obj, static_writer, true, 0);

                return static_writer.ToString ();
            }
        }

具体的Write事件在JsonWriter类中的361行:

        public void Write (string str)
        {
            DoValidation (Condition.Value);
            PutNewline ();

            if (str == null)
                Put ("null");
            else
                PutString (str);

            context.ExpectingValue = false;
        }

可以看到,实际上写入字符串的函数就是PutString,在PutString(string str) { ... }函数中,有具体的写入方法。其中将字符串中逐个字符都去除进行判断,若非转义字符,再判断是不是字母,若果都不是,就会处理为Unicode码:

             // Default, turn into a \uXXXX sequence
                // 默认情况下,转换为Unicode码(\uXXXX类型的)

             
IntToHex ((int) str[i], hex_seq);
                writer.Write ("\\u");
                writer.Write (hex_seq); 
    

根据个人程序的需求不同,可以很方便的解决这个问题。最方便的是,直接不处理任何转义字符,也就是写入原始字符串:

        private void PutString (string str)
        {
            Put (String.Empty);
            writer.Write ('"');           

            //直接存储原始字符串,不再做任何转义字符的解析
            writer.Write(str);            
            writer.Write ('"');
        }

由此,就可以很好的解决处理中文的问题了,经过测试,处理效果很好。

但并不能够保证处理任何对象都OK,所以请慎用。