我正在使用Newtonsoft的库来反序列化一个稍微复杂的对象,并且遇到了一个障碍,即MetaData对象中的ID没有被填充,其他每个值似乎都很好。所有主要对象都派生自模型类,具有核心属性,如 Id。有没有人对这里出了什么问题有任何建议?
这是我用来测试的 JSON,顶级对象是一个页面:
{
"CreatedOn": "2012-07-30T13:42:45+01:00",
"CreatedBy": "33576D49-B799-4326-812C-D6A3C47B7035",
"Name": "Icecream",
"Metadata": [
{
"CreatedOn": "2012-07-30T14:06:31+01:00",
"ModifiedOn": "2012-07-30T14:06:31+01:00",
"ModifiedBy": "53D947AC-0D7B-42C4-929E-DAFC25932784",
"Name": "Colour",
"Value": "Blue",
"NodeReference": "834a2734-e807-4eb7-a242-c26d785681f3",
"Scope": "Draft",
"Id": "032488bd-158c-4064-93ec-44bd11c4e642",
"CreatedBy": "53D947AC-0D7B-42C4-929E-DAFC25932784"
},
{
"CreatedOn": "2012-07-30T13:48:49+01:00",
"ModifiedOn": "2012-07-30T14:23:20+01:00",
"ModifiedBy": "10E0821E-1982-4C24-B9E1-35FAF9A547BB",
"Name": "Topping",
"Value": "Chocolate sprinkles",
"NodeReference": "834a2734-e807-4eb7-a242-c26d785681f3",
"Scope": "Live",
"Id": "241afb40-0d83-4599-a05e-aec1a6cdef41",
"CreatedBy": "CE1F79DE-9ECF-456F-8C17-D9B7E4B6FCA7"
}
],
"WikiResources": [
],
"FileResources": [
],
"Links": [
],
"Id": "834a2734-e807-4eb7-a242-c26d785681f3"
}
这是我的代码的(简化)版本:
public abstract class Model {
protected Guid? _id;
public Guid? Id {
get { return _id;}
set { _id = value; IsDirty = true; }
}
private string _name; //e.g page Heading
public string Name {
get { return _name; }
set { _name = value; IsDirty = true; }
}
private DateTime _createdOn;
public DateTime CreatedOn {
get { return _createdOn; }
set { _createdOn = value; IsDirty = true; }
}
private string _createdBy;
public string CreatedBy {
get { return _createdBy; }
set { _createdBy = value; IsDirty = true; }
}
[JsonIgnore]
public bool IsDirty {
get;
set;
}
[JsonIgnore]
public bool IsNew {
get;
set;
}
private List<MetaDatum> _metadata;
public List<MetaDatum> MetaData {
get {
return _metadata;
}
set {
_metadata = value;
}
}
}
public class MetaDatum : Model, IModel {
//other properties and methods omitted
#region construction
public MetaDatum() {
IsNew = false;
webservice = WebserviceManager.GetWebservice();
}
//quick factory method for creating a name value pair
public static MetaDatum Create(string name, string value, ScopeType scope) {
MetaDatum md = new MetaDatum();
md.Name = name;
md.CreatedOn = DateTime.Now;
md.Scope = scope;
md.Value = value.ToString();
md.IsNew = true;
md.IsDirty = true;
return md;
}
#endregion
}
public class Page : Model, IModel {
//other properties and methods omitted
public static Page Deserialize(string text) {
if (text == "" || text == null)
return null;
dynamic serializedObj = JsonConvert.DeserializeObject(text);
Page convertedObject = JsonConvert.DeserializeObject<Page>(text);
return convertedObject;
}
}
我有一个解决方法,可以在反序列化后手动获取 ID,方法是将其设置为动态对象并钻取它。但也许有更好的方法可以一次性做到这一点?
int i = 0;
dynamic serializedObj = JsonConvert.DeserializeObject(text);
foreach (dynamic item in serializedObj.Metadata) {
convertedObject.MetaData[i++].Id = Guid.Parse(item.Id.ToString());
}
验证您在标头中发送的数据类型 我的意思是MediaTypeWithQualityHeaderValue
(" text / plain
") <- 因为它可以是应用程序/Json或文本/json,因此可以更改此类型序列化可以完成