JSON序列化自定义页面类型返回不同的数据



我们有一个自定义页面类型Product,当序列化为JSON(使用Newtonsoft)时,Product上的属性输出不同的字段。

Product product = ProductProvider.GetProducts().FirstObject;
var json = JsonConvert.SerializeObject(product);

生成以下JSON:

{
  "LogSynchronization": 3,
  "ObjectType": "cms.document.apollo.product",
  "UpdateTimeStamp": true,
  "LastUpdated": "2016-09-26T16:23:58.9228865Z",
  "Locked": false,
  "DataClass": null,
  "UpdateVersionGUID": true,
  "Components": [
    {
      "LogSynchronization": 3,
      "ObjectType": "cms.node",
      "UpdateTimeStamp": true,
      "LastUpdated": "2016-09-26T16:23:58.9238891Z",
      "Locked": false,
      "DataClass": {
        "Locked": false,
        "IDWasChanged": false,
        "Data": [
          285,
          ...
          false
        ],
        "OriginalData": null,
        "ClassName": "CMS.Tree"
      },
      "UpdateVersionGUID": true
    },
    { ... }
  ]
}

自动生成Product.cs:

//--------------------------------------------------------------------------------------------------
// <auto-generated>
//
//     This code was generated by code generator tool.
//
//     To customize the code use your own partial class. For more info about how to use and customize
//     the generated code see the documentation at http://docs.kentico.com.
//
// </auto-generated>
//--------------------------------------------------------------------------------------------------
// ...
public partial class Product : SKUTreeNode
{
    #region "Constants and variables"
    /// <summary>
    /// The name of the data class.
    /// </summary>
    public const string CLASS_NAME = "MyProject.Product";

    /// <summary>
    /// The instance of the class that provides extended API for working with Product fields.
    /// </summary>
    private readonly ProductFields mFields;
    #endregion

    #region "Properties"
    /// <summary>
    /// ProductID.
    /// </summary>
    [DatabaseIDField]
    public int ProductID
    {
        get
        {
            return ValidationHelper.GetInteger(GetValue("ProductID"), 0);
        }
        set
        {
            SetValue("ProductID", value);
        }
    }
    /// <summary>
    /// My Custom Property.
    /// </summary>
    [DatabaseField]
    public string MyCustomProperty
    {
        get
        {
            return ValidationHelper.GetString(GetValue("MyCustomProperty"), 0);
        }
        set
        {
            SetValue("MyCustomProperty", value);
        }
    }
    // Truncated. Lots more properties here...
    #endregion

    #region "Constructors"
    /// <summary>
    /// Initializes a new instance of the <see cref="Product" /> class.
    /// </summary>
    public Product() : base(CLASS_NAME)
    {
        mFields = new ProductFields(this);
    }
    #endregion
}

我如何使此返回Product类的实际/传统序列化?

您没有得到结果,因为ProductProvider.GetProducts()返回基对象没有任何自定义属性。Newtonsoft使用类的公共属性。您可以按照以下文档

生成您自己的类,然后使用该类进行序列化。

这里的最佳实践是创建自己的模型,这样您就不必用所有属性污染JSON,而是只使用您想要和需要的属性。

CMS中有一个名为ToJSON的扩展方法。DataEngine名称空间。如果您需要以与Kentico REST相同的方式序列化对象,请使用该方法。

如果您只需要选择对象的某些部分和/或对数据进行一些转换,最简单的方法是创建一个新的匿名对象并手动初始化其属性。

如果你试图从UI获得json对象,我建议使用REST服务获得它,它将做你需要的一切。

理想情况下,您需要提供更多细节。ProductProvider.GetProducts().FirstObject返回什么类型?A TreeNode ?您期望从序列化中得到什么数据?

我怀疑你的答案在于Kentico的强类型页面类型模型。使用这种方法,你可以完全控制你的页面模型是如何序列化的,因为你可以让DocumentHelperTreeNodeProvider返回一个强类型的模型,你可以用Netonsoft的序列化属性来修饰它,例如DocumentHelper.GetDocuments<MyCustomProductModel>().First()

相关内容

  • 没有找到相关文章

最新更新