对象类型在 .net 6 中显示为空数组

问题描述 投票:0回答:1

我正在从 .netcore 2.1 迁移到 .net 6。我有一个返回类型为 Task 的端点,我有一个具有对象类型属性的类。 经过一些检查后,我返回了我的对象的良好结果,即

return Ok(myObj);
这在 .netcore 2.1 中没有任何问题,但在 .net6 中,对象属性由于某种原因返回空数组。 我直接在 .net 6 中创建了一个新应用程序,并尝试复制该问题,看看是否是我在迁移时犯的一些错误,但似乎它也不起作用。新项目如下所示:

 [HttpGet("test")]   
public IActionResult Test()
{
    var features = new Dictionary<string, bool>()
    {
        { "Foo", true },
        { "Bar", false }
    };
    var settings = new Dictionary<string, string>()
    {
        { "font-size", "16-px" },
        { "showOnStartUp", "no" }
    };
    var resp = new Result()
    {
        InnerDto = new InnerDto()
        {
            Foo = BuildObject(features.Select(f => new KeyValuePair<string, object>(f.Key, f.Value)).ToDictionary(k => k.Key, v => v.Value)),
            Bar = BuildObject(settings.Select(f => new KeyValuePair<string, object>(f.Key, f.Value)).ToDictionary(k => k.Key, v => v.Value))
        },
        S = "Test"
    };
    

    return Ok(resp);
}


private static object BuildObject(Dictionary<string, object> foo)
{

    var objects = foo.Select(f => new
    {
        Key = f.Key,
        Value = SetSettingsValueBasedOnType(f)
    }).ToList();

    var sb = new StringBuilder();
    sb.AppendLine("{");

    for (int i = 0; i < objects.Count; i++)
    {
        string val;
        var obj = objects[i];
        if (bool.TryParse(obj.Value.ToString(), out var parsedVal))
        {
            val = obj.Value.ToString()!.ToLower();
        }
        else
        {
            val = JsonConvert.SerializeObject(obj.Value);
        }

        var line = $@"""{obj.Key}"":{val}";
        sb.AppendLine(line);
        if (i < objects.Count - 1)
        {
            sb.Append(',');
        }
    }
    sb.AppendLine("}");
    var featuresObj = JsonConvert.DeserializeObject(sb.ToString());
    return featuresObj!;
}

private static object SetSettingsValueBasedOnType(KeyValuePair<string, object> bar)
{

    object val;
    if (bool.TryParse(bar.Value.ToString(), out var parseVal))
    {
        val = parseVal;
    }
    else
    {
        val = bar.Value;
    }

    return val;

}
}

   public class Result
{
   public string S { get; set; }
  public InnerDto InnerDto { get; set; }
}

public class InnerDto
{
    public object Foo { get; set; }
    public object Bar { get; set; }
}

逻辑一直运行到返回之前的最后一行,如下所示: 我得到的回应是这样的:

是什么让它在 .netcore 2.1 上工作而不是在 .net 6 上工作?

c# asp.net-core asp.net-core-webapi .net-6.0 actionresult
1个回答
1
投票

如果您正在使用

Newtonsoft.JSON
,那没问题,只需将序列化对象添加到您的对象中即可。

改变这个

return Ok(resp);

return Ok(JsonConvert.SerializeObject(resp, Formatting.Indented));

现在我们知道它是有效的,我们可以通过这样做将其全局添加到所有控制器:

builder.Services.AddControllers()
    .AddNewtonsoftJson();

在这种情况下,您可能需要安装以下软件包:

<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="6.0.13" />

那么这也可以工作

return Ok(resp);

这是你的输出:

微软文档:https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.dependencyinjection.newtonsoftjsonmvcbuilderextensions.addnewtonsoftjson?view=aspnetcore-6.0

© www.soinside.com 2019 - 2024. All rights reserved.