简体   繁体   中英

How to convert a JSON object containing an array to C# Dictionary<string,string>?

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' 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?

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:

在此处输入图片说明

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM