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.