C# Net 通用 json 轉 Object 對象
C# Net 提取 json 字符串 對象 數組
C# Net json 對象 中有字符串 轉為 對象
例如輸入:{"1":1,"a":"aa","aa":"{\"2\":2,\"bb\":\"{\\\"3\\\":3,\\\"cc\\\":\\\"ccc\\\"}\"}"}
例如輸出:{"1":1,"a":"aa","aa":{"2":2,"bb":{"3":3,"cc":"ccc"}}}
-----------------------------------------------------------------------------------
----------------如需看實現的效果,請翻到文章最后-------------------
-----------------------------------------------------------------------------------
引用包【Json.NET】 加入 名稱空間
using System; using Newtonsoft.Json.Linq;
創建一個【JsonHelper.cs】文件:
在【JsonHelper】類替換成如下代碼:
public class JsonHelper { #region 提取json對象 /// <summary> /// 提取json字符串對象 /// 例如輸入:{"1":1,"a":"aa","aa":"{\"2\":2,\"bb\":\"{\\\"3\\\":3,\\\"cc\\\":\\\"ccc\\\"}\"}"} /// 例如輸出:{"1":1,"a":"aa","aa":{"2":2,"bb":{"3":3,"cc":"ccc"}}} /// </summary> public static JObject ExtractObj(string jsonObject) { return ExtractObj(JObject.Parse(jsonObject)); } /// <summary> /// 提取json對象 /// 例如輸入:{"1":1,"a":"aa","aa":"{\"2\":2,\"bb\":\"{\\\"3\\\":3,\\\"cc\\\":\\\"ccc\\\"}\"}"} /// 例如輸出:{"1":1,"a":"aa","aa":{"2":2,"bb":{"3":3,"cc":"ccc"}}} /// </summary> public static JObject ExtractObj(JObject job) { //方法一:慢(3700個字符耗時2.2-2.4秒) //foreach (var item in job) //{ // try // { // string itemStr = item.Value.ToString(); // JObject itemJObj = JObject.Parse(itemStr); // JObject robj = ExtractObj(itemJObj); // job[item.Key] = robj; // } // catch // { // try // { // string itemStr = item.Value.ToString(); // JArray itemJArr = JArray.Parse(itemStr); // JArray rArr = ExtractArr(itemJArr); // job[item.Key] = rArr; // } // catch // { // } // } //} //return job; //方法二:快(3700個字符耗時40-60毫秒) foreach (var item in job) { var itemV = item.Value; if (itemV.Type == JTokenType.String) { var jtStr = itemV.ToString(); if (!IsJson(jtStr)) continue; JToken jToken = JToken.Parse(jtStr); if (jToken.Type == JTokenType.Object) job[item.Key] = ExtractObj((JObject)jToken); else if (jToken.Type == JTokenType.Array) job[item.Key] = ExtractArr((JArray)jToken); } else if (itemV.Type == JTokenType.Object) { job[item.Key] = ExtractObj((JObject)itemV); } else if (itemV.Type == JTokenType.Array) { job[item.Key] = ExtractArr((JArray)itemV); } } return job; } #endregion #region 提取json數組 /// <summary> /// 提取json字符串數組 /// 例如輸入:["5","6","[\"3\",\"4\",\"[\\\"1\\\",\\\"2\\\"]\"]"] /// 例如輸出:["5","6",["3","4",["1","2"]]] /// </summary> public static JArray ExtractArr(string jsonArr) { return ExtractArr(JArray.Parse(jsonArr)); } /// <summary> /// 提取json數組 /// 例如輸入:["5","6","[\"3\",\"4\",\"[\\\"1\\\",\\\"2\\\"]\"]"] /// 例如輸出:["5","6",["3","4",["1","2"]]] /// </summary> /// <param name="jArr"></param> /// <returns></returns> public static JArray ExtractArr(JArray jArr) { //方法一:慢(3700個字符耗時2.2-2.4秒) //for (int i = 0; i < jArr.Count; i++) //{ // try // { // string itemStr = jArr[i].ToString(); // JArray itemJArr = JArray.Parse(itemStr); // JArray rArr = ExtractArr(itemJArr); // jArr[i] = rArr; // } // catch // { // try // { // string itemStr = jArr[i].ToString(); // JObject itemJObj = JObject.Parse(itemStr); // JObject robj = ExtractObj(itemJObj); // jArr[i] = robj; // } // catch // { // } // } //} //return jArr; //方法二:快(3700個字符耗時40-60毫秒) for (int i = 0; i < jArr.Count; i++) { JToken jToken = jArr[i]; if (jToken.Type == JTokenType.String) { var jtStr = jToken.ToString(); if (!IsJson(jtStr)) continue; JToken jToken2 = JToken.Parse(jtStr); if (jToken2.Type == JTokenType.Array) { jArr[i] = ExtractArr((JArray)jToken2); } else if (jToken2.Type == JTokenType.Object) { jArr[i] = ExtractObj((JObject)jToken2); } } else if (jToken.Type == JTokenType.Array) { jArr[i] = ExtractArr((JArray)jToken); } else if (jToken.Type == JTokenType.Object) { jArr[i] = ExtractObj((JObject)jToken); } } return jArr; } #endregion #region 提取json對象或數組 /// <summary> /// 提取json字符串(支持json字符串的對象、數組、字符串) /// 例如輸入:["5","6","[\"3\",\"4\",\"[\\\"1\\\",\\\"2\\\"]\"]","{\"1\":2,\"a\":\"ab\"}"] /// 例如輸出:["5","6",["3","4",["1","2"]],{"1":2,"a":"ab"}] /// </summary> /// <param name="json"></param> /// <returns></returns> public static JToken ExtractAll(string json) { try { return ExtractAll(JToken.Parse(json)); } catch { throw new Exception("不是有效的JToken對象"); } } /// <summary> /// 提取json(支持json對象、數組、字符串) /// 例如輸入:["5","6","[\"3\",\"4\",\"[\\\"1\\\",\\\"2\\\"]\"]","{\"1\":2,\"a\":\"ab\"}"] /// 例如輸出:["5","6",["3","4",["1","2"]],{"1":2,"a":"ab"}] /// </summary> /// <param name="json"></param> /// <returns></returns> public static JToken ExtractAll(JToken jToken) { if (jToken.Type == JTokenType.String) { jToken = JToken.Parse(jToken.ToString()); } if (jToken.Type == JTokenType.Object) { return ExtractObj((JObject)jToken); } else if (jToken.Type == JTokenType.Array) { return ExtractArr((JArray)jToken); } else { throw new Exception("暫不支持提取[" + jToken.Type.ToString() + "]類型"); } } #endregion /// <summary> /// 是否為json(開頭是'{','['的) /// </summary> public static bool IsJson(string json) { json = json.Trim(); if (string.IsNullOrEmpty(json)) return false; var t = json.First(); if (t == '{' || t == '[') return true; return false; } }
創建控制台【測試項目】:
加入包【Json.NET】,並加入如下名稱空間:
using Newtonsoft.Json; using System.Collections.Generic;
在控制台中調用:
static void Main(string[] args)
{
Dictionary<string, object> keys = new Dictionary<string, object>
{
{ "1",2 },
{ "a", "ab" },
//{ "ab", JsonConvert.SerializeObject(vs3) },
};
List<string> vs = new List<string>() { "1", "2" };
List<string> vs2 = new List<string>() { "3", "4", JsonConvert.SerializeObject(vs) };
List<string> vs3 = new List<string>() { "5", "6", JsonConvert.SerializeObject(vs2), JsonConvert.SerializeObject(keys) };
var ss = JsonHelper.ExtractArr(JsonConvert.SerializeObject(vs3));
//var ss = JsonHelper.ExtractObj(JsonConvert.SerializeObject(keys));
string sss = ss.ToString();
}
在【www.json.cn】下的可視化結果:
原json:

處理過后的json:

完成!
