I'm looking for the best solution.
Here is a response from server and i need to get Organizations list:
Content-Type:application/json;charset=UTF-8
{
"code": 0,
"message": "success",
"organizations": [
{
"organization_id": "10234695",
"name": "Zillum",
"contact_name": "John Smith",
"email": "[email protected]",
"is_default_org": false,
"language_code": "en",
"fiscal_year_start_month": 0,
"account_created_date": "2016-02-18",
"time_zone": "PST",
"is_org_active": true,
"currency_id": "460000000000097",
"currency_code": "USD",
"currency_symbol": "$",
"currency_format": "###,##0.00",
"price_precision": 2
},
{...},
{...}
]
Here is my convert method:
var contentJson = await SendRequest(request);
var contentJo = (JObject)JsonConvert.DeserializeObject(contentJson);
var organizationsJArray = contentJo["organizations"]
.Value<JArray>();
var organizations = organizationsJArray.ToObject<List<Organization>>();
Code works, but I'm looking for a better Convert Method. Can I do without converting to JArray?
2 Answers 2
Given that you are already using the ToObject
, consider simplifying the code for readability and the advantage of not having to convert anything.
var contentJson = await SendRequest(request);
dynamic response = JsonConvert.DeserializeObject(contentJson);
List<Organization> organizations = response.organizations.ToObject<List<Organization>>();
The actual response appears to be of no concern so using a dynamic
simplifies things. Converting back to strongly typed objects by calling ToObject<T>
was a good choice and should work out fine.
Json.Net will (by default) accept missing fields without a problem when doing typed deserialization, so I believe you can do:
class ContentData
{
public List<Organization> organizations;
}
...
var contentData = JsonConvert.DeserializeObject<ContentData>(contentJson);
DoSomething(contentData.organizations);
List<Organization>
in the same way as a generic parameter for theDeserializeObject
method. There's no need to create theJObject
first. \$\endgroup\$