在C#GET请求中将JSON数据转换为查询字符串

将JSON对象转换为查询字符串以附加到GET Url的最佳方法是什么? POST很简单,我的Web API后端会读取它。

{姓名:’迈克’} =?姓名=迈克

private static string MakeRequest(HttpWebRequest req, string data) { try { if (req.Method == Verbs.POST.ToString() || req.Method == Verbs.PUT.ToString() || req.Method == Verbs.DELETE.ToString()) { var encodedData = Encoding.UTF8.GetBytes(data); req.ContentLength = encodedData.Length; req.ContentType = "application/json"; req.GetRequestStream().Write(encodedData, 0, encodedData.Length); } using (var response = req.GetResponse() as HttpWebResponse) using (var reader = new StreamReader(response.GetResponseStream())) { return reader.ReadToEnd(); } } catch (WebException we) { if(we.Response == null) { return JsonConvert.SerializeObject(new { Errors = new List { new ApiError(11, "API is currently unavailable") }}); } using (var response = we.Response as HttpWebResponse) using (var reader = new StreamReader(response.GetResponseStream())) { return reader.ReadToEnd(); } } } 

如果json对象在您的示例中是平坦的,那么

 string json = @"{ ""name"": ""charlie"", ""num"": 123 }"; var jObj = (JObject)JsonConvert.DeserializeObject(json); var query = String.Join("&", jObj.Children().Cast() .Select(jp=>jp.Name + "=" + HttpUtility.UrlEncode(jp.Value.ToString()))); 

查询将是name=charlie&num=123

我使这个代码在.Net Core中运行:

 public static string JsonToQuery(this string jsonQuery) { string str = "?"; str += jsonQuery.Replace(":", "=").Replace("{",""). Replace("}", "").Replace(",","&"). Replace("\"", ""); return str; } 

例:

 var _baseURI = "http://www.example.com/"; var endPoint = "myendpoint"; ExampleObjectModel requestModel = new ExampleObjectModel(); var requestModelJson = JsonConvert.SerializeObject(requestModel); var url = string.Format("{0}{1}{2}", _baseURI, endPoint, requestModelJson.JsonToQuery()); 

试试这个,深入研究所有对象

  public static class ExtensionMethods { public static string GetQueryString(this object obj, string prefix = "") { var query = ""; try { var vQueryString = (JsonConvert.SerializeObject(obj)); var jObj = (JObject)JsonConvert.DeserializeObject(vQueryString); query = String.Join("&", jObj.Children().Cast() .Select(jp => { if (jp.Value.Type == JTokenType.Array) { var count = 0; var arrValue = String.Join("&", jp.Value.ToList().Select(p => { var tmp = JsonConvert.DeserializeObject(p.ToString()).GetQueryString(jp.Name + HttpUtility.UrlEncode("[") + count++ + HttpUtility.UrlEncode("]")); return tmp; })); return arrValue; } else return (prefix.Length > 0 ? prefix + HttpUtility.UrlEncode("[") + jp.Name + HttpUtility.UrlEncode("]") : jp.Name) + "=" + HttpUtility.UrlEncode(jp.Value.ToString()); } )) ?? ""; } catch (Exception ex) { } return query; } } 

使用:SomeObject.GetQueryString();