我正在从 .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 上工作?
如果您正在使用
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);
这是你的输出: