【问题标题】:Convert JSON data to querystring in C# GET request在 C# GET 请求中将 JSON 数据转换为查询字符串
【发布时间】:2012-09-18 14:26:31
【问题描述】:

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

{姓名:“迈克”} = ?Name=迈克

 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<ApiError> { new ApiError(11, "API is currently unavailable") }});
                    }

                    using (var response = we.Response as HttpWebResponse)
                    using (var reader = new StreamReader(response.GetResponseStream()))
                    {
                        return reader.ReadToEnd();
                    }
                }


  }

【问题讨论】:

    标签: c# asp.net json get query-string


    【解决方案1】:

    如果 json 对象像您的示例中那样平坦,那么

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

    查询将是name=charlie&amp;num=123

    【讨论】:

    • 这会处理数组 Includes=["Assets","Prices"]
    • 先生这太聪明了!我也喜欢你的小胡子。
    【解决方案2】:

    我让这段代码在 .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());
    

    【讨论】:

      【解决方案3】:

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

       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<JProperty>()
                     .Select(jp =>
                     {
                         if (jp.Value.Type == JTokenType.Array)
                         {
                             var count = 0;
                             var arrValue = String.Join("&", jp.Value.ToList().Select<JToken, string>(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();

      【讨论】:

        猜你喜欢
        • 2017-11-17
        • 2015-06-24
        • 2020-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多