最近工作中,遇到了一个转发请求的需求场景,需要写一个程序,专门负责将前端的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字符串代码是本人费了一番功夫折腾出来的,并亲测有效,如果有类似需求的伙伴可以拿去参考