我从第三方API获取了大量JSON数据,如下所示:
returnValue = data["value"].ToObject<List<T>>();
除了一个字段之外的所有字段都只是基本名称:这样的值对:
"Name":"Value"
我将我需要的值映射到这样的类:
public sealed class Project
{
public string Id { get; set; }
public string Title { get; set; }
public string Url { get; set; }
public DateTime ProjectDateLocal { get; set; }
public string ParentFolderName { get; set; }
public string ParentFolderId { get; set; }
//causing trouble
public Int32 ProjectTypeId { get; set; }
public string PlayerUrl
{
get
{
return "http://em.edu.edu/prj/Play/" + this.Id;
}
}
}
但是,一个名称:值对很复杂:
"CustomFieldValues":[
{
"FieldName":"ProjectTypeId","FieldDefinitionId":"37a2ffeb3bd441f6a60158458910a04d40","DataType":"Integer","Value":"100105"
}
]
我只需要FieldName(ProjectTypeId)和Value,有没有办法让类识别出来并将其设置在我的ProjectTypeId属性中?
谢谢!
答案 0 :(得分:2)
使用Json.net反序列化JsonConvert.Deserialize<Project>(jsonStringContent)
Json.net将进入多个级别,只需添加一个新类,让Project
拥有该属性。
public class CustomFieldValue
{
public string FieldName {get;set;}
public string Value {get; set;}
}
并将其列表添加到您的项目中。
public sealed class Project
{
public string Id { get; set; }
...
public List<CustomFieldValue> CustomFieldValues { get; set; }
}
Json.net不会有任何问题。如果你不添加FieldDefinitionId
等,那么Json.net将忽略它。
答案 1 :(得分:1)
正如@viggity所述,您可以使用Newtonsoft解决您的问题,并且提供的解决方案很好。你唯一要做的就是为Deserializer提供一个好的字符串json。
如果您想要更简单的解决方案,为什么不使用data["value"].ToObject<List<Project>>()
?
注意:为映射分配像[JsonProperty("FieldNameFromJson")]
这样的属性是完整的。
有关如何执行此操作的详细信息,请参阅此post。