这是一篇关于在后台使用C#语言将Json字符串转化为对象集合类的介绍,适用于处理后台接收Json字符串,将Json字符串转Xml或者其他格式的场合。
主要的思想如下:
JsonProxy类
json集合使用List<List<JsonClass>>表示。
json对象使用List<JsonClass>表示。
其中JsonClass表示Json字符串一个一个的Key-Value。
&#61;&#61;》JsonClass(key,value,type,fullstring......)
//Create By YZR
public class JsonClass{#region 成员//&#61;&#61;&#61;>"name":"YZR"private string fullString;public string FullString{get { return fullString; }set { fullString &#61; value; }}private string key;public string Key{get { return key; }set { key &#61; value; }}private JsonClass[] jcs;private List<object> valueContainer;//json集合形式&#xff0c;存放的可能是json对象&#xff0c;也可能是object类型值public List<object> ValueContainer{get { return valueContainer; }set { valueContainer &#61; value; }}private List> jsonContainer;public List
> JsonContainer{get { return jsonContainer; }set { jsonContainer &#61; value; }}public JsonClass[] Jcs{get { return jcs; }set { jcs &#61; value; }}private object value;public object Value{get { return this.value; }set { this.value &#61; value; }}private SubJsonType valueType;public SubJsonType ValueType{get { return valueType; }set { valueType &#61; value; }}#endregion#region 构造函数public JsonClass(){}public JsonClass(string key, object value){this.key &#61; key;this.value &#61; value;this.fullString &#61; key &#43; ":" &#43; value;}public JsonClass(string key, List<object> valueContainer){this.key &#61; key;this.valueContainer &#61; valueContainer;}//集合public JsonClass(string key, JsonClass[] jcs){this.key &#61; key;this.jcs &#61; jcs;}//对象public JsonClass(string str){this.fullString &#61; str;init();}#endregionprivate void init(){JosnProxy jp &#61; new JosnProxy(fullString);jp.init();if (jp.JsonType &#61;&#61; JsonType.Object)//json对象
{List
{SubJsonType subType &#61; JsonParse.JudgeJsonType(fullString.Substring(1, fullString.Length - 2));//SubJsonType subType &#61; JsonParse.JudgeJsonType(fullString);switch (subType){case SubJsonType.Object:this.valueContainer &#61; jp.valueContainer;break;case SubJsonType.JsonClass:this.jsonContainer &#61; jp.jsonContainer;break;}}}}
将json转为对象主要是通过JsonProxy类进行的。
///
}}public void init(JsonKey JK)//JsonParse.ToJsonCode(jsonArray[0])
{switch (JK){case JsonKey.LeftBraces:Begin(JsonType.Object);break;case JsonKey.LeftMiddle:Begin(JsonType.Object);break;case JsonKey.Colon:case JsonKey.Comma:case JsonKey.RightBraces:case JsonKey.RightMiddle:break;//不正常的json字符串default:break;//包含其他字符串的不正常字符串
}}private void Begin(JsonType _jsonType){this.JsonType &#61; _jsonType;JsonObject jObject &#61; new JsonObject();int i &#61; 1;string jsonClassKey &#61; string.Empty;string jsonClassValue &#61; string.Empty;if (_jsonType &#61;&#61; JsonType.List){#region 处理集合List<string> list &#61; getJsonObject(jsonString);foreach (string item in list){SubJsonType subType &#61; JsonParse.JudgeJsonType(item);//对象if (subType &#61;&#61; SubJsonType.JsonClass){JosnProxy jp &#61; new JosnProxy(item);jp.init();List
{jObject.valueContainer.Add(item);}}#endregionjsonContainer &#61; jObject.jsonContainer;//对象集合valueContainer &#61; jObject.valueContainer;//值集合
}else{#region 处理对象DealJsonList(i, ref jObject, jsonClassKey, jsonClassValue);#endregionjsonList &#61; jObject.jsonClassList;//对象//jsonContainer &#61; jObject.jsonContainer;//对象集合//valueContainer &#61; jObject.valueContainer;//值集合
}}private void DealJsonList(int i, ref JsonObject jObject, string jsonClassKey, string jsonClassValue){while (i > 0 && i
{if (jsonArray[i] &#61;&#61; &#39;"&#39;){int EndIndex &#61; FingRightBraces(i);//从开始索引为i到结束索引为EndIndex截取字符串&#xff0c;封装为JsonClass对象,保存在JsonObject对象的if (string.IsNullOrEmpty(jsonClassKey)){jsonClassKey &#61; jsonString.Substring(i, EndIndex - i &#43; 1);}else{jsonClassValue &#61; jsonString.Substring(i, EndIndex - i &#43; 1);JsonClass jc &#61; new JsonClass(jsonClassKey, jsonClassValue);jObject.jsonClassList.Add(jc);jsonClassKey &#61; string.Empty;}i &#61; EndIndex &#43; 1;}else if (jsonArray[i] &#61;&#61; &#39;,&#39;){i&#43;&#43;;}else if (jsonArray[i] &#61;&#61; &#39;}&#39;){i &#61; 0;}else if (jsonArray[i] &#61;&#61; &#39;:&#39;){i&#43;&#43;;}else if (jsonArray[i] &#61;&#61; &#39;{&#39;)//对象
{int _right &#61; jsonString.IndexOf(&#39;}&#39;, i);int _left &#61; jsonString.IndexOf(&#39;{&#39;, i);//嵌套if (_right !&#61; -1){jsonClassValue &#61; jsonString.Substring(i, _right - i &#43; 1);}JsonClass subJsonClass &#61; new JsonClass(jsonClassValue);JsonClass jc &#61; new JsonClass(jsonClassKey, subJsonClass.Jcs);jc.ValueType &#61; SubJsonType.JsonClass;jObject.jsonClassList.Add(jc);jsonClassKey &#61; string.Empty;i &#61; _right &#43; 1;}else if (jsonArray[i] &#61;&#61; &#39;[&#39;){int _right &#61; jsonString.IndexOf(&#39;]&#39;, i);int _left &#61; jsonString.IndexOf(&#39;[&#39;, i &#43; 1);SubJsonType subType &#61; SubJsonType.None;if (_left !&#61; -1 && _left <_right)//嵌套
{//int Nesting &#61; FindNestingCount(jsonString, i, _right, &#39;[&#39;);//嵌套数// _right &#61; FindRight(jsonString, _right, &#39;]&#39;, Nesting);_right &#61; SeniorFindIndex(jsonString, i, &#39;[&#39;, &#39;]&#39;);jsonClassValue &#61; jsonString.Substring(i, _right - i &#43; 1);subType &#61; JsonParse.JudgeJsonType(jsonClassValue.Substring(1, jsonClassValue.Length - 2));}else{jsonClassValue &#61; jsonString.Substring(i, _right - i &#43; 1);subType &#61; JsonParse.JudgeJsonType(jsonClassValue.Substring(1, jsonClassValue.Length - 2));}JsonClass subJsonClass &#61; new JsonClass(jsonClassValue);//JsonClass[] jsc &#61; new JsonClass[subJsonClass.Jcs.Length];//jsc[0] &#61; subJsonClass;
JsonClass jc;if (subType &#61;&#61; SubJsonType.Object){//jObject.valueContainer &#61; subJsonClass.ValueContainer;jc &#61; new JsonClass(jsonClassKey, subJsonClass.ValueContainer);jc.ValueType &#61; SubJsonType.JslnContainer;//json集合(值集合)jc.FullString &#61; jsonClassKey &#43; ":" &#43; jsonClassValue;//构造函数没赋值fullString&#xff0c;所以需要在这里补上
jObject.jsonClassList.Add(jc);}else if (subType &#61;&#61; SubJsonType.JsonClass){jc &#61; new JsonClass();jc.Key &#61; jsonClassKey;jc.JsonContainer &#61; subJsonClass.JsonContainer;jc.ValueType &#61; SubJsonType.JslnContainer;jc.FullString &#61; jsonClassKey &#43; ":" &#43; jsonClassValue;jObject.jsonClassList.Add(jc);}else{jc &#61; new JsonClass();}jsonClassKey &#61; string.Empty;i &#61; _right &#43; 1;}else if (jsonArray[i] &#61;&#61; &#39;]&#39;){}else//数值或者布尔值
{int index &#61; jsonString.IndexOf(&#39;,&#39;, i);if (index &#61;&#61; -1){index &#61; jsonString.IndexOf(&#39;}&#39;, i);}jsonClassValue &#61; jsonString.Substring(i, index - i);JsonClass jc &#61; new JsonClass(jsonClassKey, jsonClassValue);jc.ValueType &#61; SubJsonType.Object;jObject.jsonClassList.Add(jc);jsonClassKey &#61; string.Empty;i&#43;&#43;;}}}private int FingRightBraces(int StartIndex){return jsonString.IndexOf(&#39;"&#39;, StartIndex &#43; 1);}/// > jsonContainer;///
{//int Nesting &#61; FindNestingCount(jsonContainer, i, _right, &#39;{&#39;);//嵌套数//_right &#61; FindRight(jsonContainer, _right, &#39;}&#39;, Nesting);_right &#61; SeniorFindIndex(jsonContainer, i, &#39;{&#39;, &#39;}&#39;);}list.Add(jsonContainer.Substring(i, _right - i &#43; 1));i &#61; _right &#43; 1;}else if (arr[i] &#61;&#61; &#39;,&#39;){if (StartContact){list.Add(jsonContainer.Substring(BeginTemp, i - BeginTemp));StartContact &#61; false;}i&#43;&#43;;}else if (arr[i] &#61;&#61; &#39;]&#39;){//结束if (StartContact){list.Add(jsonContainer.Substring(BeginTemp, i - BeginTemp));StartContact &#61; false;}i&#43;&#43;;}else if (arr[i] &#61;&#61; &#39;"&#39;)//Object之字符串类型 Object之数值字符串或者布尔类型字符串
{if (!StartContact){StartContact &#61; true;BeginTemp &#61; i;}else{list.Add(jsonContainer.Substring(BeginTemp &#43; 1, i - BeginTemp - 1));StartContact &#61; false;}i&#43;&#43;;}else{//list.Add(arr[i].ToString());if (!StartContact){StartContact &#61; true;BeginTemp &#61; i;}//else//{// list.Add(jsonContainer.Substring(BeginTemp &#43; 1, i - BeginTemp - 1));// StartContact &#61; false;//}i&#43;&#43;;}}return list;}public int SeniorFindIndex(string jsonString, int BeginIndex, char left_word, char right_word){string subStr &#61; string.Empty;subStr &#61; jsonString.Substring(BeginIndex &#43; 1, jsonString.Length - BeginIndex - 1);List<int> LeftList &#61; new List<int>();List<int> RightList &#61; new List<int>();int _left &#61; 0;int _rigth &#61; 0;while (_left !&#61; -1 && _rigth !&#61; -1){_left &#61; subStr.IndexOf(left_word, _left);if (_left !&#61; -1){LeftList.Add(_left);_left&#43;&#43;;}_rigth &#61; subStr.IndexOf(right_word, _rigth);if (_rigth !&#61; -1){RightList.Add(_rigth);_rigth&#43;&#43;;}}int k &#61; 0;bool run &#61; true;while (RightList[k] > LeftList[k] && run){if (LeftList.Count &#61;&#61; k &#43; 1){run &#61; false;}else{k&#43;&#43;;}}return run &#61;&#61; true ? RightList[k] &#43; BeginIndex &#43; 1 : RightList[k &#43; 1] &#43; BeginIndex &#43; 1;}///
注意&#xff1a;这里并没有加上异常处理&#xff0c;所以使用之前需要先确认json是否是一个符合规范并且正确格式的json字符串。
RJson的几个辅助类&#xff1a;
internal class JsonObject{public List> jsonContainer &#61; new List
>();//对象集合public List<object> valueContainer &#61; new List<object>();//值集合
}public enum SubJsonType{Object,//值JsonClass,//对象JslnContainer,//集合
None}public enum JsonType{Object,//对象List,//集合
None}
public enum JsonKey{LeftMiddle,//左中括号 [
RightMiddle,//右中括号 ]
LeftBraces,//左大括号 {
RightBraces,//右大括号 }
Comma,//逗号
Colon,//冒号
Quote,//双引号
None}public class JsonParse{///
}else if (arr[0] &#61;&#61; &#39;[&#39;){return SubJsonType.JslnContainer;}else if (arr[0] &#61;&#61; &#39;{&#39;){return SubJsonType.JsonClass;}else return SubJsonType.None;}///
最后展示一下Demo&#xff1a;
RJson 1.0版本问题&#xff1a;1.josn字符串本身包含七个关键词需要处理2.json字符串的异常处理3.json字符串的验证//测试代码如下&#xff1a;static void Main(string[] args){//JsonHelper.JosnString &#61; "{\"number\":2,\"who\":\"YZR\",\"GrilFirend\":{\"Name\":\"LYF\",\"number\":3},\"Firend\":{\"Name\":\"Dog\",\"number\":4,\"Age\":1}}";//JsonHelper.JosnString &#61; "[{\"Name\":\"YZR\",\"number\":1,\"Firend\":{\"Name\":\"Dog\",\"number\":4,\"Age\":1}},{\"Name\":\"LYF\",\"number\":2,\"Firend\":{\"Name\":\"Dog\",\"number\":4,\"Age\":1,\"Type\":{\"Sex\":\"Man\",\"City\":\"GZ\"}}},{\"Name\":\"Dog\",\"number\":3}]";//JsonHelper.JosnString &#61; "{\"number\":2,\"who\":[\"YZR\",\"LYF\"],\"Firend\":[{\"Name\":\"Dog\",\"number\":4,\"Age\":1},{\"Name\":\"Dog\",\"number\":4,\"Age\":1}]}";//JsonHelper.JosnString &#61; "{\"number\":2,\"Firend\":[{\"Name\":\"YZR\",\"Color\":[\"1\",\"2\"]},{\"Name\":\"LYF\",\"Color\":[\"3\",\"4\"]}]}";JsonHelper.JosnString &#61; "{\"number\":2,\"Firend\":[{\"Name\":\"YZR\",\"Color\":[1,2]},{\"Name\":\"LYF\",\"Color\":[3,4]}]}";//JsonHelper.JosnString &#61; "[{\"number\":2,\"Firend\":[{\"Name\":\"YZR\",\"Color\":[1,2]},{\"Name\":\"LYF\",\"Color\":[3,4]}]},{\"number\":1}]";//JsonHelper.JosnString &#61; "[{\"number\":2,\"Firend\":[{\"Name\":\"YZR\",\"Color\":[1,2]},{\"Name\":\"LYF\",\"Color\":[3,4]},{\"number\":1}]}]";int len &#61; JsonHelper.JosnString.Length;Console.WriteLine("整个长度为:" &#43; len &#43; ",第二个字符是:" &#43; JsonHelper.JosnString[1]);JosnProxy jp &#61; new JosnProxy(JsonHelper.JosnString);jp.init();if (jp.JsonType &#61;&#61; JsonType.Object)//json对象
{List
{List> list &#61; jp.jsonContainer;//json集合#region 业务处理#endregion}}static void DealObject(){//Do Some Tings
}static void DealJsonClass(JsonClass jc){//Do Some Tingsstring jsonString &#61; jc.FullString;}