添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

最近工作中,遇到了一个转发请求的需求场景,需要写一个程序,专门负责将前端的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);
                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)
                    //得到键当前值
                    string itemStr = item.Value.ToString();
                    if(itemStr.StartsWith("["))
                        //数组只能用数组的转换对象进行转换
                        JArray itemJArrObj= JsonConvert.DeserializeObject<JArray>(itemStr);
                        //递归调用
                        JArray rArrobj = ExtractArrObj(itemJArrObj);
                        //为当前键更新为对象值
                        job[item.Key] = rArrobj;
                        //尝试转化为对象(可能失败)
                        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字符串代码是本人费了一番功夫折腾出来的,并亲测有效,如果有类似需求的伙伴可以拿去参考