- 谈到json,那可谓是现在到处横行,上至,java,C#,下到 javascript,php,但今天我要说说我在json 里遇到的哪些事。
json 数据读取
-
在这里先列出一串json数据
{
“account” : “test1@test”,
“nickname” : “客服1”,
“password” : “pswmd5”,
} -
我们用那几种方式来读着一串数据呢,一下说几点我的观点,
1.按照面向对象的原则
+ 先建立一个VO对象,对象的字段为上述json重的字段,通过typeof 来获取对象的制
+ 用JavaScriptSerializer 来获取对象的值,先建立VO对象,
JavaScriptSerializer serializer = new JavaScriptSerializer ();
//result 为上述 json 数据
TicketVO tk= serializer.Deserialize<TicketVO> (resutl); > 2.自己写程序要解析json,以下是我自己写的一段程序,望不要见笑
/// <summary>
/// 获取Json字符串某节点的值
/// jsonStr 为json 数据
/// 要获取值的名称
/// </summary>
public string GetJsonValue(string jsonStr, string key)
{
string result = string.Empty;
if (!string.IsNullOrEmpty(jsonStr))
{
key = "\"" + key.Trim('"') + "\"";
int index = jsonStr.IndexOf(key) + key.Length + 1;
if (index > key.Length + 1)
{
//先截逗号,若是最后一个,截“}”号,取最小值
int end = jsonStr.IndexOf(',', index);
if (end == -1)
{
end = jsonStr.IndexOf('}', index);
}
result = jsonStr.Substring(index, end - index);
result = result.Trim(new char[] { '"', ' ', '\'' });
//过滤引号或空格
}
}
return result;
} ## json 数据的格式
-
不说了,先来上一串字符串吧
{ "articles": [ { "thumb_media_id":"KLOJaywbO6z4Fw709GzNWnkiEvvvTG2iLbK8Xq4iDYrlpBYtGHAPR6jlKEyA-Zvr", "author":"协力法讯", "title":"12月26 第二届协力全国律师辩论赛报名", "content_source_url”:”<p style=margin-left=“margin-left:10px””>互联网尽力的效益</p><a href=“#”>fdsfsd</a> <img src=“http://www.baidu.com”><.img>", "digest":"舌战群儒展雄风,针锋相对辩天下。精英荟萃显才华,英雄齐聚论时事。法律是学的入世,政治的产物,力量的博弈,历史的沉淀,道德的强制,利益的调和。", "show_cover_pic":"1" } ] }
- 上面的字符串或许有的人会很熟悉,但是我在这个上面缺花费了不少的时间,这是在微信开发中上传图文消息到微信服务器中的一串代码,
-
这一点json 解析的时候,始终不通过,终其原因
1. json 中不能有空格存在, 2. json 中不能有css 代码存在, 3. json 中不能存在<a> 超链接标签 4. json 中不能存在<img> 图片标签 <p style="color:red;font-weight:bold">以上我这些使json不通过的原因是我自己通过实践得到的,具体还有哪些因素会导致json不能解析,我这不知道。</p>
+问题找到了,下面就来对症下药了
+说了这么多不能通过的原因,那我们就将content_source_url字段进行encode 编码,因为只有这个字段有以上的json 不能通过的字符,
string content_source_url = "中国";
byte[] btCN = System.Text.Encoding.Default.GetBytes(content_source_url);
string strUTF8 = System.Text.Encoding.UTF8.GetString(btCN);
+这样json解析终于可以通过了,然后将json提交到微信服务器,文章上传后,是直接退送给用户的,没有地方可以解码 encode,用户收到的都是乱码字符。既然这个,就只能过滤字符串了。
Regex reg4=new Regex( @"<(\S*?)[^>]*>"); //去掉字符串中的空格
Regex reg = new Regex(@"(?i)</?a\b[^>]*>"); //去掉字符串的<a>标签
Regex reg1=new Regex(@"<img[^>]*?/>"); //去掉img标签
Regex reg2=new Regex(@"style=""[^""]*"""); //去掉style标签 string result = reg.Replace(d.content, "");
result = reg1.Replace (result, "");
result = reg2.Replace (result, "");
result=reg4.Replace(result,"")
这样字符串中的json不能通过的字符都被过滤了,同时html标签都存在,也不会影响用户的正常阅读