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