7

I am using Newtonsoft.Json in my project. I have JObject like this:

{
    "4781":"Name 1",
    "1577":"Name 2",
    "9973":"Name 3"
}

I successfully parse it with JObject.Parse(). I need to get first key from this JObject ("4781"). How do I get it?

chanafdo
  • 5,016
  • 3
  • 29
  • 46
BArtWell
  • 4,176
  • 10
  • 63
  • 106

1 Answers1

17

Json.NET doesn't directly provide integer indexed access to the properties of a JObject.

If you do JObject.Parse(jsonString)[0] you get an ArgumentException with the message

Accessed JObject values with invalid key value: 0. Object property name expected."

Demo #1 here.

I suspect Json.NET was implemented that way because the JSON standard states, "An object is an unordered set of name/value pairs."

That being said, JObject inherits from JContainer which does explicitly implement IList<JToken>. Thus if you upcast a JObject to IList<JToken> you can access the properties by an integer index corresponding to document order:

IList<JToken> obj = JObject.Parse(jsonString);
var firstName = ((JProperty)obj[0]).Name;

Demo fiddle #2 here.

Alternatively you could use LINQ for a type-safe solution without any casting:

using System;
using System.Linq;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;


var obj = JObject.Parse(jsonString);
var firstName = obj.Properties().Select(p => p.Name).FirstOrDefault();

Demo fiddle #3 here.

dbc
  • 104,963
  • 20
  • 228
  • 340