Paul Hazen Paul Hazen - 5 days ago 4
C# Question

Get value from JToken that may not exist (best practices)

What's the best practice for retrieving JSON values that may not even exist in C# using Json.NET?

Right now I'm dealing with a JSON provider that returns JSON that sometimes contains certain key/value pairs, and sometimes does not. I've been using (perhaps incorrectly) this method to get my values (example for getting a double):

if(null != jToken["width"])
width = double.Parse(jToken["width"].ToString());
else
width = 100;


Now that works fine, but when there are a lot of them it's cumbersome. I ended up writing an extension method, and only after writing it did I wonder whether maybe I was being stupid... anyways, here is the extension method (I only include cases for double and string, but in reality I have quite a few more):

public static T GetValue<T>(this JToken jToken, string key,
T defaultValue = default(T))
{
T returnValue = defaultValue;

if (jToken[key] != null)
{
object data = null;
string sData = jToken[key].ToString();

Type type = typeof(T);

if (type is double)
data = double.Parse(sData);
else if (type is string)
data = sData;

if (null == data && type.IsValueType)
throw new ArgumentException("Cannot parse type \"" +
type.FullName + "\" from value \"" + sData + "\"");

returnValue = (T)Convert.ChangeType(data,
type, CultureInfo.InvariantCulture);
}

return returnValue;
}


And here's an example of using the extension method:

width = jToken.GetValue<double>("width", 100);


BTW, Please forgive what may be a really dumb question, since it seems like something there should be a built in function for... I did try Google, and Json.NET documentation, however I'm either inept at finding the solution to my question or it's not clear in the documentation.

Answer

This is pretty much what the generic method Value() is for. You get exactly the behavior you want if you combine it with nullable value types and the ?? operator:

width = jToken.Value<double?>("width") ?? 100;
Comments