复杂json字符串转换成通用Json对象

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

原文地址:https://www.cnblogs.com/mooncher/p/13253563.html