I would keep the first part of your solution (deserializing to JObject
), but I wouldn't do another serialization. My code would look like this:
var jo = JObject.Parse(json);
var jp = jo.Properties().First();
var name = jp.Name;
var person = jp.Value.ToObject<Person>();
Edit:
In case you want a custom converter, you could use the following code. The converter converts your object to a list of Person
s where every property represents another Person
.
class PersonListConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var list = (PersonList) value;
writer.WriteStartObject();
foreach (var p in list.Persons)
{
writer.WritePropertyName(p.Name);
serializer.Serialize(writer, p);
}
writer.WriteEndObject();
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var jo = serializer.Deserialize<JObject>(reader);
var result = new PersonList();
result.Persons = new List<Person>();
foreach (var prop in jo.Properties())
{
var p = prop.Value.ToObject<Person>();
// set name from property name
p.Name = prop.Name;
result.Persons.Add(p);
}
return result;
}
public override bool CanConvert(Type objectType)
{
return objectType == typeof(PersonList);
}
}
Where PersonList
would look like this:
[JsonConverter(typeof(PersonListConverter))]
class PersonList
{
public List<Person> Persons { get; set; }
}