4

我正在使用 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;
        }   

}
4

2 回答 2

0

我有一个解决方法,可以在反序列化后手动获取 Id,方法是将其设置为动态对象并钻入其中。但也许有更好的方法可以一次性做到这一点?

int i = 0;           
dynamic serializedObj = JsonConvert.DeserializeObject(text);
foreach (dynamic item in serializedObj.Metadata) {
    convertedObject.MetaData[i++].Id = Guid.Parse(item.Id.ToString());
}
于 2012-08-17T13:40:30.420 回答
0

验证您在标头中发送的数据类型我的意思是MediaTypeWithQualityHeaderValue(“ text / plain”)<-因为它可以是应用程序/Json或文本/json,所以可以更改这种类型可以进行序列化

于 2018-01-22T17:13:09.780 回答