1

I am sending a request to a WebAPI using following code:

client.PostAsync(baseAddress + path, new FormUrlEncodedContent(JsonConvert.DeserializeObject<Dictionary<string,string>>(form)))

where client is an object of HttpClient class. This code is executed for all the requests to the WebApi. I am trying to send following data to the API:

{
    "code":"GUEST",
    "category":"Indian",
    "sections":["01000000-0000-0000-0000-000000000000","02000000-0000-0000-0000-000000000000"],
    "date":"0001-01-01T00:00:00",
    "time":"0001-01-01T00:00:00",
    "quantity":1.0,
    "price":0.0,
    "discount":0.0,
    "paymentMethod":"ID",
    "paymentMethodID":null,
    "ticketNo":null
}

Now because the FormUrlEncodedContent accepts only the Dictionary<string,string> object, I am converting this JSON into that type using NewtonSoft's JSON.NET method JsonConvert.DeserializeObject. But at the point where sections array starts, it is showing me this error message: Unexpected character encountered while parsing value:[. Path 'sections'.

So, what approach should I follow if I want to use the same code for this kind of JSON data?

2
  • You won't be able to send this as FormUrlEncodedContent. Can't you simply send the json as a body of your post request, not URL-encoded? Commented Nov 15, 2018 at 8:59
  • 1
    @Pac0 Actually the API only accepts in this format. I tried other ways but no luck. Also, other methods are passing the data in the same way. Commented Nov 15, 2018 at 9:14

1 Answer 1

2

If you for any reason need to send all values as strings, then you must convert array of strings to string before deserializing it to Dictionary<string, string>.

It can be done like this:

var json = "{\"code\":\"GUEST\",\"category\":\"Indian\",\"sections\":[\"01000000-0000-0000-0000-000000000000\",\"02000000-0000-0000-0000-000000000000\"],\"date\":\"0001-01-01T00:00:00\",\"time\":\"0001-01-01T00:00:00\",\"quantity\":1.0,\"price\":0.0,\"discount\":0.0,\"paymentMethod\":\"ID\",\"paymentMethodID\":null,\"ticketNo\":null}";

var jObject = JObject.Parse(json);
jObject["sections"] = JsonConvert.SerializeObject(jObject["sections"].ToObject<string[]>());

var result = JsonConvert.DeserializeObject<Dictionary<string, string>>(jObject.ToString());

That way you will get result:

enter image description here

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

1 Comment

Thanks :) This worked. Although I modified the logic to incorporate this. But it's working fine now.

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.