復雜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字符串代碼是本人費了一番功夫折騰出來的,並親測有效,如果有類似需求的伙伴可以拿去參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM