我们有一个自定义页面类型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的强类型页面类型模型。使用这种方法,你可以完全控制你的页面模型是如何序列化的,因为你可以让DocumentHelper
或TreeNodeProvider
返回一个强类型的模型,你可以用Netonsoft的序列化属性来修饰它,例如DocumentHelper.GetDocuments<MyCustomProductModel>().First()