cry*_*eam 6 c# json.net deserialization
这是json文件的一个示例:
{
"John Smith": {
"id": "72389",
"email": "johnsmith@gmail.com",
"books": [
{
"id": "0",
"title": "The Hunger Games",
"rating": "5"
},
{
"id": "1",
"title": "Harry Potter and the Order of the Phoenix",
"rating": "3"
},
],
"magazines": [
{
"id": "2",
"title": "National Geographic",
"rating": "1"
},
{
"id": "3",
"title": "Wired",
"rating": "4"
}
],
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,根节点有一个动态名称(John Smith),我需要反序列化的每个json都有不同的名称.这个json结构需要按如下方式设置类:
public class RootObject
{
public JohnSmith { get; set; }
}
public class JohnSmith //oops
{
public string id { get; set; }
public string email { get; set; }
public List<Book> books { get; set; }
public List<Magazine> magazines { get; set; }
}
public class Book
{
public string id { get; set; }
public string title { get; set; }
public string rating { get; set; }
}
public class Magazine
{
public string id { get; set; }
public string title { get; set; }
public string rating { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的目标是反序列化"绕过/忽略"根对象,最重要的是动态命名节点.这并不重要,但我希望能够获取姓氏并将其设置为Person类的属性.
public class Person
{
public string id { get; set; }
public string email { get; set; }
public string name { get; set; }
public List<Book> books { get; set; }
public List<Magazine> magazines { get; set; }
}
public class Book
{
public string id { get; set; }
public string title { get; set; }
public string rating { get; set; }
}
public class Magazine
{
public string id { get; set; }
public string title { get; set; }
public string rating { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是我现在这样做的方式:
var jo = JObject.Parse(json);
var deserializable = jo.First.First.ToString();
string name;
var jp = (JProperty)jo.First;
if (jp != null) name = jp.Name;
var person = JsonConvert.DeserializeObject<Person>(deserializable);
person.name = name;
Run Code Online (Sandbox Code Playgroud)
这工作正常,但我想知道,也许通过使用自定义JsonConverter可以做得更好?我担心这有点过头了,所以我在这里要求一些帮助......
无论如何,如果有更好的方法来实现这一目标,请分享.
fer*_*ero 10
我会保留你的解决方案的第一部分(反序列化JObject),但我不会做另一个序列化.我的代码看起来像这样:
var jo = JObject.Parse(json);
var jp = jo.Properties().First();
var name = jp.Name;
var person = jp.Value.ToObject<Person>();
Run Code Online (Sandbox Code Playgroud)
编辑:
如果您需要自定义转换器,可以使用以下代码.转换器将您的对象转换为Persons 列表,其中每个属性代表另一个属性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);
}
}
Run Code Online (Sandbox Code Playgroud)
哪里PersonList是这样的:
[JsonConverter(typeof(PersonListConverter))]
class PersonList
{
public List<Person> Persons { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4826 次 |
| 最近记录: |