使用 JSON 和 C# 反序列化对象时缺少 guid



我正在使用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,因此可以更改此类型序列化可以完成

相关内容

  • 没有找到相关文章

最新更新