• 复杂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字符串代码是本人费了一番功夫折腾出来的,并亲测有效,如果有类似需求的伙伴可以拿去参考

  • 相关阅读:
    Django contenttypes组件
    Django admin组件使用
    Django 信号
    Django 中间件
    Django 分页组件替换自定义分页
    Django ORM操作补充
    Django ORM 操作2 增删改
    Django 序列化
    JavaScript
    CSS 属性
  • 原文地址:https://www.cnblogs.com/mooncher/p/13253563.html
Copyright © 2020-2023  润新知