序列化对象列表时输出id而不是完整对象



我正在使用MVC 4 Web API,遇到了一个无法找到答案的序列化问题。关于代码。。。

假设我有以下类:

public class Item {
    public int ID;
    public String Name;
    public bool Active;
}
public class Source {
    public int ID;
    public int Name;
}

项目的序列化列表看起来像:

{
    ID: 1,
    Name: "That big thing",
    Active: true,
    Source: {
        ID: 1,
        Name: "The street"
    }
}

如果我的列表中有很多项,那么将每个源序列化为一个对象的效率会很低。我只想在列表中获取源ID。类似于:

{
    ID: 1,
    Name: "That big thing",
    Active: true,
    Source: 1
}

根据您序列化的项目列表,我假设Item类还包含一个Source属性,类似于:

public class Item {
    public int ID;
    public String Name;
    public bool Active;
    public Source Source;
}

如果是这种情况,您可以向Source属性添加XmlIgnore属性,然后将源的id公开为新的SourceID属性:

    public class Item
    {
        public int ID;
        public String Name;
        public bool Active;
        [XmlIgnore]
        public Source Source;
        [XmlElement("Source")]
        public int SourceID
        {
            get
            {
                if (Source != null)
                {
                    return Source.ID;
                }
                else
                {
                    return 0;
                }
            }
            set
            {
                // ignore incoming values
            }
        }
    }

json库可能不支持Xml属性;如果是这种情况,您可以使用其相应的属性(即JsonIgnore、JsonProperty)。

这里发布的[JsonIgnore]建议很好,但它只适用于JSON.NET序列化。

要以通用方式执行此操作,请添加对System.Runtime.SerializationDLL的引用,并相应地装饰您的模型:

[DataContract]
public class Source
{
    [DataMember]
    public int ID;
    public int Name;
}

这将省略您在Web API中使用的任何MediaTypeFormatting中的Name属性,即

<Active>true</Active>
<ID>1</ID>
<Name>test</Name>
<Source>
 <ID>1</ID>
</Source>

"ID":1,
"Name":"test",
"Active":true,
"Source":{"ID":1}

相关内容

  • 没有找到相关文章

最新更新