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

时间:2016-09-26 16:35:45

标签: json serialization json.net kentico

我们有一个自定义页面类型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类的实际/传统序列化?

4 个答案:

答案 0 :(得分:2)

您没有收到结果,因为ProductProvider.GetProducts()返回的基础对象没有任何自定义属性。 Newtonsoft使用类的公共属性。您可以生成自己的类,然后按照this documentation

进行序列化

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

如果您尝试从UI获取json对象,我建议您使用REST服务,它将执行您需要的所有操作。了解如何使用它here

答案 3 :(得分:0)

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

我怀疑你的回答是strongly-typed page type models in Kentico。使用此方法,您可以完全控制页面模型的序列化方式,因为您可以使DocumentHelperTreeNodeProvider返回强类型模型,您可以使用Netonsoft的序列化属性进行修饰,例如DocumentHelper.GetDocuments<MyCustomProductModel>().First()