2

我正在开发一个 ASP .Net Core 3.1 应用程序,使用 2.2 从另一个应用程序移植部分代码。到目前为止,我想从 NewtonSoft JSON 序列化库切换到新的 System.Text.Json,但我遇到了一些麻烦。

考虑一个函数来提供具有此返回类型的 HTTP-GET 服务:

    [HttpGet("myservice")]
    public async Task<ActionResult<object>> GetDataAsync( ...

然后,最后一部分可以描述如下:

        var items = new List<IMyInterface>();
        int totalCount = ...
        int min = ...
        int max = ...

        return new ActionResult<object>(new
        {
            totalCount,
            min,
            max,
            items
        });

但是,它不起作用:items 集合由其声明的类型 (IMyInterface) 序列化,而不是实际类型。我在这里读到这是一种预期的行为,尽管对我来说不是那么直观。

我的问题是:是否有任何方便而可靠的方法来利用新的序列化程序,甚至处理匿名对象?每次我可以内联组合结果时,我都会避免创建一个特定的对象。

更新:

这样做似乎可行,但看起来真的很难看:

        return new ActionResult<object>(new
        {
            totalCount,
            min,
            max,
            items = items.Cast<object>()
        });
4

1 回答 1

0

点网提琴手

如果要序列化对象,为什么不将它们初始化为对象呢?是否需要创建强类型?

    public static void Test()
    {
        var items = new List<object>() { new Class1 { Foo = "foo1", Bar1 = "Bar1" }, new Class2 { Foo = "foo1", Bar2 = "Bar2" } };
        int totalCount = 1;
        int min = 2;
        int max = 3;


        var root = new
        {
            totalCount,
            min,
            max,
            items,
        };

        var json = JsonSerializer.Serialize<object>(root, new JsonSerializerOptions { WriteIndented = true, });

        Console.WriteLine(json);
    }

如果您将项目创建为List<object>,则无需更改或执行任何操作。这可能是一种更简洁的方法,而不是在创建对象时将它们中的每一个都转换为对象。

于 2020-01-03T16:23:56.410 回答