当前位置: 首页 > 面试题库 >

MVC3 JSON序列化:如何控制属性名称?

华锦程
2023-03-14
问题内容

我想将一个简单的对象序列化为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

我究竟做错了什么?


问题答案:

我通过使用此问题答案中提供的技术解决了这个问题:

这是我上的课:

/// <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; }
}


 类似资料:
  • 问题内容: 有没有一种方法可以控制with属性的JSON输出,类似于您如何使用及其属性控制XML序列化的输出? 例如,给定以下类别: 然后,我想获得以下输出: 相对于: 问题答案: 我想要的东西比Jarrett建议的要多一些,所以这就是我要做的: JsonDataContractActionResult: JsonContract()方法,添加到我的基本控制器类中: 用法示例: Note: If

  • 问题内容: 在我的课上,我有: 在通过重新运行System.Web.Mvc.JsonResult的控制器的Json(obj)传递对象之后:我已经序列化了json:{Member:…}但没有{jsonMemberName:…},所以它看起来不在DataMember(Name =“ jsonMemberName”)。 如果我使用System.Runtime.Serialization.Json的序列化

  • 问题内容: 是否可能:在类中有一个字段,而在Jackson库中进行序列化/反序列化时却为其使用不同的名称? 例如,我有“ Coordiantes”类。 对于从JSON反序列化,希望具有以下格式: 但是当我序列化对象时,结果应该是这样的: 我试图通过在getter和setter上都应用注释(具有不同的值)来实现此目的: 但我有一个例外: org.codehaus.jackson.map.exc.Un

  • 问题内容: 我要呼吁汇率第三方API,但JSON返回不断变化,如果我申请到的转换,它将返回我:,所以如果我的要求来,它将返回我。 我将不得不使用将返回的结果映射到pojo中,是否有任何可行的方法? 我当前的硬编码解决方法: 问题答案: 是具有值的字段的对象。 否是with键/值对。 两者都是正确的,但是由于before的值是动态的(变化的),因此它是您需要的第二种解释。 因此,请勿要求将JSON转

  • 问题内容: 我的课有一个属性’PropertyA’,我希望它在序列化时在JSON对象中显示为’PropertyB’。我可以使用某种属性吗? 问题答案: 对于与使用: 确保您的课程也用属性修饰。 如果您使用的是JavaScriptSerializer,则需要创建派生的实现

  • 问题内容: 如何设置Newtonsoft.Json以使用旧成员名称反序列化对象,但使用当前成员名称序列化该对象? 编辑:一项要求是将过时的成员从要序列化/反序列化的类中删除。 这是一个需要序列化和反序列化的示例对象。我给了一个属性一个属性,该属性包含过去可能已序列化过的名称的列表。 我想始终使用名称“ a”对json进行序列化,但能够从任何旧名称(包括“ alpha”和“ omega”)以及当前名