C# 在umbraco中序列化已发布内容

C# 在umbraco中序列化已发布内容,c#,json,serialization,umbraco,C#,Json,Serialization,Umbraco,我目前正在为公司正在编写的自定义应用程序编写api。其中一部分涉及以JSON格式发布内容。当我尝试直接序列化IPPublishedContent时,它显然会尝试序列化我根本不需要的所有umbraco数据和关系(事实上,它会因堆栈溢出而失败)。有没有办法只从内容项中获取自定义属性而不指定字段 我正在使用webapi并传递它的对象来序列化它自己,我正在使用一个动态函数来手动指定字段。我最初选择的产品类型来自modelsbuilder。我的代码目前看起来有点像这样: public object Get

我目前正在为公司正在编写的自定义应用程序编写api。其中一部分涉及以JSON格式发布内容。当我尝试直接序列化IPPublishedContent时,它显然会尝试序列化我根本不需要的所有umbraco数据和关系(事实上,它会因堆栈溢出而失败)。有没有办法只从内容项中获取自定义属性而不指定字段

我正在使用webapi并传递它的对象来序列化它自己,我正在使用一个动态函数来手动指定字段。我最初选择的产品类型来自modelsbuilder。我的代码目前看起来有点像这样:

public object Get(string keywords = "")
{
    // Get Data from Umbraco
    var allProducts = Umbraco.TypedContent(1100).Children.Select(x => new Product(x));
    if (keywords != "")
    {
        allProducts = allProducts.Where(x => x.Name.Contains(keywords));
    }


    return allProducts.Select(x => new
    {
        id = x.Id,
        name = x.Name,
        price = x.Price
    });
}
在我看来,应该有一个简单的方法来做到这一点,而不必创建一个只包含我想要的字段的动态,但我无法计算出来。我只是不想每次umbraco中的文档类型更改时都要更改代码

您可以使用将数据映射到对象

创建属性与字段别名匹配的对象(不区分大小写)

然后使用
.As

return allProducts.As<Product>();
返回所有products.As();
如果别名与json不同,您也可以使用
UmbracoProperty
属性指定别名,或者使用该属性更改序列化时的名称。

您可以使用该属性将数据映射到对象

创建属性与字段别名匹配的对象(不区分大小写)

然后使用
.As

return allProducts.As<Product>();
返回所有products.As();

如果别名与json所需的别名不同,您也可以使用
UmbracoProperty
属性来指定别名,或者使用该属性在序列化时更改名称。

查看MemberListView中的代码-它在检索成员时也会做类似的事情,而不必事先知道该别名上的属性是什么成员类型将为:

例如:

[DataContract(Name = "content", Namespace = "")]
public class MemberListItem
{
    // The following properties are "known" - common to all IPublishedContent
    [DataMember(Name = "id")]
    public int Id { get; set; }

    [DataMember(Name = "name")]
    public string Name { get; set; }

    [DataMember(Name = "contentType")]
    public IContentType ContentType { get; set; }

    // This one contains a list of all other custom properties.
    private Dictionary<string, string> properties;
    [DataMember(Name = "properties")]
    public IDictionary<string, string> Properties
    {
        get
        {
            if (properties == null)
                properties = new Dictionary<string, string>();
            return properties;
        }
    }
}
[DataContract(Name=“content”,Namespace=”“)]
公共类成员列表项
{
//以下属性是“已知的”-所有IPPublishedContent都通用
[数据成员(Name=“id”)]
公共int Id{get;set;}
[数据成员(Name=“Name”)]
公共字符串名称{get;set;}
[DataMember(Name=“contentType”)]
公共IContentType内容类型{get;set;}
//此属性包含所有其他自定义属性的列表。
私有字典属性;
[DataMember(Name=“properties”)]
公共索引属性
{
得到
{
如果(属性==null)
属性=新字典();
归还财产;
}
}
}

MemberListView使用
AutoMapper
SearchResult
列表转换为此,但您也可以很容易地从IPPublishedContent映射它。

查看MemberListView中的代码-它在检索成员时做类似的事情,而不事先知道MemberType上的属性是什么:

例如:

[DataContract(Name = "content", Namespace = "")]
public class MemberListItem
{
    // The following properties are "known" - common to all IPublishedContent
    [DataMember(Name = "id")]
    public int Id { get; set; }

    [DataMember(Name = "name")]
    public string Name { get; set; }

    [DataMember(Name = "contentType")]
    public IContentType ContentType { get; set; }

    // This one contains a list of all other custom properties.
    private Dictionary<string, string> properties;
    [DataMember(Name = "properties")]
    public IDictionary<string, string> Properties
    {
        get
        {
            if (properties == null)
                properties = new Dictionary<string, string>();
            return properties;
        }
    }
}
[DataContract(Name=“content”,Namespace=”“)]
公共类成员列表项
{
//以下属性是“已知的”-所有IPPublishedContent都通用
[数据成员(Name=“id”)]
公共int Id{get;set;}
[数据成员(Name=“Name”)]
公共字符串名称{get;set;}
[DataMember(Name=“contentType”)]
公共IContentType内容类型{get;set;}
//此属性包含所有其他自定义属性的列表。
私有字典属性;
[DataMember(Name=“properties”)]
公共索引属性
{
得到
{
如果(属性==null)
属性=新字典();
归还财产;
}
}
}

MemberListView使用
AutoMapper
SearchResult
列表转换为这个,但是您也可以很容易地从IPPublishedContent映射它。

这不需要我每次更改文档类型上的字段时都重新创建一个类吗?关键是动态输出文档上的任何有用字段,而无需在每次文档类型更改时重新编译项目。它会自动为每种文档类型创建类。另一个选项是在IPPublishedContent的properties集合中循环,并将别名+值添加到字典中。这将像json中的对象一样输出。是的,正如问题中提到的,我已经在使用modelsbuilder(.Select(x=>new Product(x)),希望它能实现我想要的功能,但它也包括所有无关的umbraco字段和引用。我确实尝试从文档中输出properties集合,但其中也有很多不需要的内容。我想唯一的选择可能是循环浏览属性,并将它们与我感兴趣的类型列表进行比较,但这似乎有点冗长,因为它似乎应该很简单。我想我今天早上无法阅读。。。我知道如果您使用服务(未缓存),它将使用content.ContentType.PropertieTypes或content.ContentType.ComposedPropertyTypes直接提供内容类型之外的所有属性。这不会返回任何内部字段。对prop类型的别名发出一个请求并对ipublshedcontent集合使用它们可能不会对性能造成太大的影响。这难道不需要我每次更改文档类型上的字段时都重新创建一个类吗?关键是动态输出文档上的任何有用字段,而无需在每次文档类型更改时重新编译项目。它会自动为每种文档类型创建类