5
\$\begingroup\$

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": "johnsmith@zillum.com",
       "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?

\$\endgroup\$
  • \$\begingroup\$ You're not handling errors and corner-cases but, well, that might be OK...is there a specific goal? To me this small snippet looks OK (I have, maybe, just few opinionated minor style comments) but you may have some more specific issues in mind (performance? maintainability?) \$\endgroup\$ – Adriano Repetti Jun 4 '18 at 9:35
  • \$\begingroup\$ You can use the List<Organization> in the same way as a generic parameter for the DeserializeObject method. There's no need to create the JObject first. \$\endgroup\$ – t3chb0t Jun 4 '18 at 9:38
  • \$\begingroup\$ @t3chb0t it cannot be convert directly, because root object it's not an Array \$\endgroup\$ – Nikita Goncharuk Jun 4 '18 at 10:15
  • \$\begingroup\$ oh, ok, then put it in another object that has a property of this type. \$\endgroup\$ – t3chb0t Jun 4 '18 at 10:16
  • \$\begingroup\$ @AdrianoRepetti Yeah, thanks a lot. I'm using error handling. I thought that there is a shorter conversion, because I'm not familiar with the methods Newtonsoft.Json \$\endgroup\$ – Nikita Goncharuk Jun 4 '18 at 10:23
5
\$\begingroup\$

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.

\$\endgroup\$
1
\$\begingroup\$

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);
\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.