7

What is the best way to convert a JSON object into query strings to append to a GET URL? The POST is straightforward and gets read by my web API backend.

{Name: 'Mike' } = ?Name=Mike

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();
        }
    }
}

4 Answers 4

24

If the json object is flat as in your example, then

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())));

query would be name=charlie&num=123

Sign up to request clarification or add additional context in comments.

3 Comments

Would this handle an array Includes=["Assets","Prices"]
This is very clever sir! I like your mustache as well.
This will not handle arrays correctly.
4

I make this code to run in .Net Core:

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

Example:

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());

Comments

0

Try this, work all object, in deep

 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;
    }
}

To use: SomeObject.GetQueryString();

Comments

0

if your object(Entity) have a Children like this Entity :

public class Parent
{
    public Child childs { get; set; } = new Child();
    public int PageIndex { get; set; }
    public int? PageSize { get; set; }
}    
public class Child 
{
    public int Id { get; set; }
    public string Name { get; set; }
}

Your Can Use This Code For Build Query: First Convert You Enrity Model To JObject And Call This Method :

        public static string GetQueryString(this JObject jObj)
    {
        return String.Join("&",
             jObj.Children().Cast<JProperty>()
             .Select(jp =>
             {
                 if (jp.Value.Type == JTokenType.Object)
                 {
                     var arrValue = String.Join("&",
                     jObj.Values().Children().Cast<JProperty>()
                     .Select(jp => jp.Path + "=" + HttpUtility.UrlEncode(jp.Value.ToString())));
                     return arrValue;
                 }
                 else
                 {
                     var arrValue = String.Join("&", jp.Name + "=" + HttpUtility.UrlEncode(jp.Value.ToString()));
                     return arrValue;
                 }
             }
             )) ?? "";
    }

Your Can Get Like This QueryString :

childs.Id=1&childs.Name="Test"&PageIndex=1&PageSize=1

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.