浅谈json遇到的那些事(1)

  • 谈到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标签都存在,也不会影响用户的正常阅读