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

时间:2012-08-05 01:15:44

标签: .net asp.net-mvc-4 json.net asp.net-web-api

我正在使用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
}

2 个答案:

答案 0 :(得分:0)

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

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

如果是这种情况,您可以将XmlIgnore属性添加到Source属性,然后将源的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)。

答案 1 :(得分:0)

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

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

[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}