3

I'm using Newtonsoft to deserialize an known JSON object and retrieve some values from it if they're present.

The crux is there is that object structure may keep changing so I'm using dynamic to traverse the structure and retrieve the values. Since the object structure keeps changing, I'm using the null conditional operator to traverse the JSON.

The code looks like this

dynamic jsonMeta = JsonConvert.DeserializeObject<dynamic>(jsonScript);
string gVal = jsonMeta.a?.b?.c?.d?.e?.f?.g?.Value ?? ""

The whole idea of this is to traverse the object in a null safe manner so that if a member doesn't exist, it evaluates to null and it assigns it a default value without throwing an exception. But what I'm seeing is that I get a exception 'Newtonsoft.Json.Linq.JValue' does not contain a definition for 'e' if that member d is null.

My understanding is that while the Value of d is null, it's of type JValue so that's why the null conditional operator doesn't work, but then it tries to access member e inside d it throws the exception.

So my question is how can I make this work in C#? Is there an easy way to access the JSON members without knowing the JSON structure in a single line or relatively easy way?

rboy
  • 2,018
  • 1
  • 23
  • 35
  • This looks to be a near duplicate question of [Null-coalescing operator returning null for properties of dynamic objects](https://stackoverflow.com/a/29053805/3744182) - just substitute "null coalescing" with "null conditional" and that answer applies here. But it seems you don't want to know why the null conditional operator doesn't work, you want a workaround, correct? – dbc Apr 09 '22 at 00:16
  • 1
    *So my question is how can I make this work in C#? Is there an easy way to access the JSON members without knowing the JSON structure in a single line or relatively easy way?* -- you could use a JSONPath query using [`SelectToken()`](https://www.newtonsoft.com/json/help/html/SelectToken.htm). – dbc Apr 09 '22 at 00:19
  • @dbc That's correct, I know the reason I'm looking for a solution on how to achieve the intent of using an null coalescing and null conditional (they're different but similar) operators in a dynamic JSON unknown structure. `SelectToken` again doesn't seem to check each member against a `null` from your example above. The idea is to check each member against a `null` value since any of them could potentially be a `null` at runtime and we don't know to end up with an exception, but instead handle it gracefully for each member if the structure has a `null` anywhere in the chain. – rboy Apr 09 '22 at 04:21

1 Answers1

1

Unfortunately due to the design limitation of NewtonSoft JSON.NET it cannot use null coalescing or null conditional operators in the way that I want to above.

The only solution I found is to use System.Web.Helpers.Json, this implementation allows you to do what I'm trying to do above without running into the exception that JSON.NET throws because the way it evaluates the members at runtime leading to a simple way to access members of dynamic JSON structures. Plus you don't need to reference Value for a member, it's implicit.

using System.Web.Helpers.Json

dynamic jsonMeta = Json.Decode(jsonString);
string gVal = jsonMeta.a?.b?.c?.d?.e?.f?.g ?? ""

You however need to install the assemblies separately depending on which version of Visual Studio you're using (which is also required for JSON.NET). With VS 2019, it's very easy to install it with a single click through the IDE error assistant. More details about it here: Where can I find System.Web.Helpers, System.Web.WebPages, and System.Web.Razor?

rboy
  • 2,018
  • 1
  • 23
  • 35