为什么我的ICollection <interface>的项目来自WebAPI调用?

时间:2016-04-08 18:36:12

标签: c# asp.net-web-api interface

我正在进行WebAPI调用以获得类似于此对象的对象:

import javax.swing.*;
import java.awt.*;

public class MyDrawPanel extends JPanel {

    private static final int WIDE = 300;
    private static final int HIGH = 200;


    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.orange);
        g.fillRect(20, 50, 100, 100);
    }

    public MyDrawPanel() {
        setBackground(Color.white);
        // Set a initial size for the program window
        this.setPreferredSize(new Dimension(WIDE, HIGH));
    }

     private void display() {
        // Some statements to let the JFrame appear in a good way
        JFrame f = new JFrame("MyDrawPanel");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

     // Main method is called when the program is runned
     public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new MyDrawPanel().display();
            }
        });
    }
}

正确填充ID和其他属性。 SubCategories prop具有正确大小的集合,但每个条目都为null。

知道为什么吗?我不能把它变成一个具体类型的集合(在我的控制之外),但是WebAPI能够找出它应该是哪个类......

2 个答案:

答案 0 :(得分:1)

此答案假设您使用的是JSON.net,这是ASP.NET WebAPI的默认设置。由于JSON.net不了解如何创建IDocumentCategoryTree的具体实例,因此无法为您自动反序列化。所以你需要自己这样做,这样做的方式就是为你的班级使用JsonConverter:

public class DocumentCategoryModel : IDocumentCategoryTree
{
    public DocumentCategoryModel()
    {
        SubCategories = new List<IDocumentCategoryTree>();
    }

    public int ID { get; set; }

    [JsonConverter(typeof(DocumentCategoryTreeConverter)]
    public ICollection<IDocumentCategoryTree> SubCategories { get; set; }
}

public class DocumentCategoryTreeConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        // Todo if desired
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        return serializer.Deserialize<TestTree>(reader);
    }

    public override bool CanConvert(Type objectType)
    {
        // Todo
    }
}

这是一个非常简单且不完整的示例,可让您了解如何执行此操作并开始使用。您可以在此处的其他一些SO帖子中详细了解JsonConverterHow to implement custom JsonConverter in JSON.NET to deserialize a List of base class objects?

答案 1 :(得分:0)

XML和JSON序列化/反序列化应该在具体类中进行。如果它没有具体,它就不会知道如何正确地序列化它。我建议为DocumentCatTreeApiModel创建一个具体的内容,例如"/cat/noeud/key"。这将使序列化过程正常工作。