WebAPI 列表序列化 XML/JSON 输出

本文关键字:XML JSON 输出 序列化 列表 WebAPI | 更新日期: 2023-09-27 18:35:52

我试图在ApiController中创建如下所示的方法:

public DemoList<Demo> GetAll()
{
    var result = new DemoList<Demo>() { new Demo(){Y=2}, new Demo(), new Demo(){Y=1} };
    result.Name = "Test";
    return result;
}
演示

和演示列表如下所示:

public interface INamedEnumerable<out T> : IEnumerable<T>
{
    string Name { get; set; }
}
public class Demo
{
    public int X { get { return 3; } }
    public int Y { get; set; }
}
public class DemoList<T> : List<T>, INamedEnumerable<T>
{
    public DemoList()
    {
    }
    public string Name { get; set; } 
}

然后我用小提琴手敲了一下

GET http://localhost:8086/api/Demo

并得到以下内容:

XML(接受标头设置为应用程序/xml)

<ArrayOfDemo xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/XXX.WebAPI"><Demo><Y>2</Y></Demo><Demo><Y>0</Y></Demo><Demo><Y>1</Y></Demo></ArrayOfDemo>

JSON(接受标头设置为应用程序/json)

[{"X":3,"Y":2},{"X":3,"Y":0},{"X":3,"Y":1}]

我的问题很简单:为什么 X 变量没有使用 XML 版本序列化(我认为只读属性是序列化的),更重要的是,为什么在这两种情况下 Name 属性(可写)都没有序列化?有什么替代方案可以使这项工作像我预期的那样?

编辑:请注意,我处于WebAPI上下文中!默认情况下,XmlSerializer 自动设置为 XmlMediaTypeFormatter,JSONSerializer 自动设置为 JsonMediaTypeFormatter

WebAPI 列表<T>序列化 XML/JSON 输出

似乎是一个错误...使用以下解决方法可以解决问题:

public class ListWrapper<T>
{
    public ListWrapper(INamedEnumerable<T> list)
    {
        List = new List<T>(list);
        Name = list.Name;
    }
    public List<T> List { get; set; }
    public string Name { get; set; }
}
XML 序列化

程序仅允许序列化提供"set"的属性。

你用什么来序列化它?如果你不需要属性,你可以使用DataContractSerializer,如此处所述。默认情况下,没有集合的属性不会序列化,但是使用 DataContractSerializer 或实现 IXmlSerializable 应该可以为您解决问题。

using System;
using System.Runtime.Serialization;
using System.Xml;
[DataContract]
class MyObject {
    public MyObject(Guid id) { this.id = id; }
    [DataMember(Name="Id")]
    private Guid id;
    public Guid Id { get {return id;}}
}
static class Program {
    static void Main() {
        var ser = new DataContractSerializer(typeof(MyObject));
        var obj = new MyObject(Guid.NewGuid());
        using(XmlWriter xw = XmlWriter.Create(Console.Out)) {
            ser.WriteObject(xw, obj);
        }
    }
}