正则表达式:
正则表达式主要的参考文章:。
需求:将cocos2dx客户端上传的Json对象转换为C#对象。
Json对象:
{ "_A":10, "_B":"123", "__cname":"Object","_ListC":[{ "_BaseA":10, "_BaseB":"yes","__cname":"BaseObject"}, { "_BaseA":20, "_BaseB":"no","__cname":"BaseObject"}]}
服务端不需要"__cname"属性。
转换代码:
private string AdjustInputJson(string input) { string pattern1 = "\"__cname\":\".*?\""; //消除cocos客户端的__cname属性 string pattern2 = @",\s?,"; //,, 转 , string pattern3 = @"{\s?,"; //{, 转 { string pattern4 = @",\s?}"; //,} 转 } Regex r1 = new Regex(pattern1); Regex r2 = new Regex(pattern2); Regex r3 = new Regex(pattern3); Regex r4 = new Regex(pattern4); Match m1 = r1.Match(input); var tmpString1 = r1.Replace(input, ""); Match m2 = r2.Match(tmpString1); var tmpString2 = r2.Replace(tmpString1, ","); Match m3 = r3.Match(tmpString2); var tmpString3 = r3.Replace(tmpString2, "{ "); Match m4 = r4.Match(tmpString3); var tmpString4 = r4.Replace(tmpString3, "}"); return tmpString4; }
其他代码 - 单个适配获取:
string pattern = "\"__cname\":\".*?\""; Regex r = new Regex(pattern); Match m = r.Match(content); if(m.Success) { Console.WriteLine(m.Value); }
其他代码 - 多个适配获取:
string pattern = "\"__cname\":\".*?\""; var resGroup = Regex.Matches(content, pattern); foreach(var match in resGroup) { Console.WriteLine(match.ToString()); }
Json转换:
C#一般用 Newtonsoft.Json。
问题在于对 List 的转换:之前一直以为要将其反序列化为 Scut 的 CacheList 的,需要手动修改 Json 串,为其增加 CacheList 的私有变量 “_List”,最后发现不用。
原因应该在于 Newtonsoft.Json 的序列/反序列化,针对的是 IList 这个基类,而 CacheList 是有继承 IList 的。
待验证噢。
推荐分享: