最近工作中,遇到了一個轉發請求的需求場景,需要寫一個程序,專門負責將前端的json請求通過.net程序轉發給到java的api,而且是根據前端指定的接口名轉發給不同的api。
在這種情況下,如果要針對每個api去定義json字符串的接收對象,顯然工作量會很大,而且也不靈活,一旦有api的變動,作為中間轉發程序都得跟着改
所以這個中間轉發程序將api返回的json字符串轉換成通用的json對象再經過處理轉發就很有必要。
廢話不多說,直接貼出本人將json字符串轉換成通用json對象的核心方法
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace Transfer.Controllers { public class TransferController : ApiController { [HttpPost] public HttpResponseMessage Transfer(HttpRequestMessage request) { string postStr = request.Content.ReadAsStringAsync().Result; ApiParam param = JsonConvert.DeserializeObject<ApiParam>(postStr); string json= "{\"success\":false,\"errorCode\":\"500\",\"errorMessage\":\"參數有誤\"}"; if (param.Uri == "") { return new HttpResponseMessage { Content = new StringContent(json, System.Text.Encoding.UTF8, "application/json") }; } json = TransferManager.Instance.TrasferRequest(param); try { JObject jobj = JsonConvert.DeserializeObject<JObject>(json);//把上面的json字符串初步轉換為 Jobject對象 //Newtonsoft.Json.Linq.JObject jobj = obj as Newtonsoft.Json.Linq.JObject;//把上面的obj轉換為 Jobject對象 //進一步深度解析復雜json字符串為json通用對象 jobj = ExtractObj(jobj); return Request.CreateResponse(HttpStatusCode.OK, jobj); } catch(Exception ex) { json = "{\"success\":false,\"errorCode\":\"500\",\"errorMessage\":\"請求接口失敗:" + json + "\"}"; Object obj = JsonConvert.DeserializeObject(json); Newtonsoft.Json.Linq.JObject jobj = obj as Newtonsoft.Json.Linq.JObject;//把上面的obj轉換為 Jobject對象 return Request.CreateResponse(HttpStatusCode.OK, jobj); } //return new HttpResponseMessage { Content = new StringContent(json, System.Text.Encoding.UTF8, "application/json"),StatusCode= HttpStatusCode.OK }; } /// <summary> /// 深度解析復雜json字符串為json通用對象 /// </summary> /// <param name="job"></param> /// <returns></returns> public static JObject ExtractObj(JObject job) { foreach (var item in job) { try { //得到鍵當前值 string itemStr = item.Value.ToString(); if(itemStr.StartsWith("[")) { //數組只能用數組的轉換對象進行轉換 JArray itemJArrObj= JsonConvert.DeserializeObject<JArray>(itemStr); //遞歸調用 JArray rArrobj = ExtractArrObj(itemJArrObj); //為當前鍵更新為對象值 job[item.Key] = rArrobj; } else { //嘗試轉化為對象(可能失敗) JObject itemJObj = JsonConvert.DeserializeObject<JObject>(itemStr); //遞歸調用 JObject robj = ExtractObj(itemJObj); //為當前鍵更新為對象值 job[item.Key] = robj; } } catch { } } return job; } //針對json中的數組進行處理 public static JArray ExtractArrObj(JArray jarr) { foreach(var item in jarr) { //得到當前值 string itemStr = item.ToString(); //嘗試轉化為對象(可能失敗) JObject itemJObj = JsonConvert.DeserializeObject<JObject>(itemStr); //遞歸調用 JObject robj = ExtractObj(itemJObj); } return jarr; } } }
以上深度解析json字符串代碼是本人費了一番功夫折騰出來的,並親測有效,如果有類似需求的伙伴可以拿去參考