关于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,所以请慎用。
- 关于LitJson中文的问题
- litjson解析的一个小问题
- 【Json】关于LitJson和相关Json的使用
- 关于JAVA的中文问题
- 关于JAVA的中文问题
- MYSQL 关于中文的问题
- 关于中文转换的问题
- 关于中文模拟器的问题
- 关于中文乱码的问题
- 关于中文乱码的问题
- LitJson的使用
- LitJson 的使用
- LitJson的使用
- litjson插件的使用
- Unity3d LitJson 的使用
- litjson
- Litjson
- LitJson
- 动态获取时间
- 上海五年
- fork(2)&&vfork
- 汉诺塔JAVA版算法
- Help Needed in compilation when TARGET_BUILD_VARIANT is set as "user".
- 关于LitJson中文的问题
- Word C# 报异常 无法访问此集合中的单独的行,因为表格有纵向合并的单元格
- C语言中可变参数的用法
- Ext.Net License 问题
- 关于CVS和Checkstyle的使用(给组里的新同学)(一)
- sql中的常见函数
- 关于Segmentation fault(段错误)探究
- goldengate 故障及解决方法汇总
- Linux 共享库管理:ld.so.conf 与 LD_LIBRARY_PATH