我们有一个自定义页面类型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
类的实际/传统序列化?
答案 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。使用此方法,您可以完全控制页面模型的序列化方式,因为您可以使DocumentHelper
或TreeNodeProvider
返回强类型模型,您可以使用Netonsoft的序列化属性进行修饰,例如DocumentHelper.GetDocuments<MyCustomProductModel>().First()