我想将一个简单的对象序列化为JSON:
public class JsonTreeNode { [DataMember(Name = "title")] public string Title { get; set; } [DataMember(Name = "isFolder")] public bool IsFolder { get; set; } [DataMember(Name = "key")] public string Key { get; set; } [DataMember(Name = "children")] public IEnumerable<JsonTreeNode> Children { get; set; } [DataMember(Name = "select")] public bool SelectedOnInit { get; set; } }
但是只要我这样做:
return Json(tree, JsonRequestBehavior.AllowGet);
属性名称不作为指定[DataMember]部分,但类似于那些直接定义在类如的情况下SelectOnInit它不是select,但SelectOnInit。
[DataMember]
SelectOnInit
select
我究竟做错了什么?
我通过使用此问题答案中提供的技术解决了这个问题:
这是我上的课:
/// <summary> /// Similiar to <see cref="JsonResult"/>, with /// the exception that the <see cref="DataContract"/> attributes are /// respected. /// </summary> /// <remarks> /// Based on the excellent stackoverflow answer: /// https://stackoverflow.com/a/263416/1039947 /// </remarks> public class JsonDataContractActionResult : ActionResult { /// <summary> /// Initializes a new instance of the class. /// </summary> /// <param name="data">Data to parse.</param> public JsonDataContractActionResult(Object data) { Data = data; } /// <summary> /// Gets or sets the data. /// </summary> public Object Data { get; private set; } /// <summary> /// Enables processing of the result of an action method by a /// custom type that inherits from the ActionResult class. /// </summary> /// <param name="context">The controller context.</param> public override void ExecuteResult(ControllerContext context) { if (context == null) throw new ArgumentNullException("context"); var serializer = new DataContractJsonSerializer(Data.GetType()); string output; using (var ms = new MemoryStream()) { serializer.WriteObject(ms, Data); output = Encoding.UTF8.GetString(ms.ToArray()); } context.HttpContext.Response.ContentType = "application/json"; context.HttpContext.Response.Write(output); } }
用法:
public ActionResult TestFunction() { var testObject = new TestClass(); return new JsonDataContractActionResult(testObject); }
我还必须修改初始类:
// -- The DataContract property was added -- [DataContract] public class JsonTreeNode { [DataMember(Name = "title")] public string Title { get; set; } [DataMember(Name = "isFolder")] public bool IsFolder { get; set; } [DataMember(Name = "key")] public string Key { get; set; } [DataMember(Name = "children")] public IEnumerable<JsonTreeNode> Children { get; set; } [DataMember(Name = "select")] public bool SelectedOnInit { get; set; } }