如何解决ASP.NET核心OData:将包含字典的类序列化为JSON,字典成为键值对的数组需要它成为一个对象
* Edit:事实证明,这与位于OData
控制器上有关。从startup.cs在下面添加OData配置。
免责声明:我今晚没有时间制作代码的真实最小可复制版本。我刚刚将OData设置从我的较大项目中删除了。抱歉!我将尝试在星期一回头并创建一个真正的最小可复制版本。
我正在尝试以这种基本格式返回JSON:
{ "Name": "hello",Props: { "a":"1","b":"2" }}
Props
是一个词典,如果我将此代码移至“常规”控制器,它将按预期工作。但是在OData控制器上,它会将Dictionary序列化为对象数组,如下所示:
[ { "Key": "a","Value": "1"},...]
我认为下面的OData配置是我正在做的所有工作,而且我不相信我尝试覆盖任何JSON序列化设置。
简单版本的控制器代码:
public class SuperObject{
public SuperObject(string name){
Name = name;
Props = new Dictionary<string,string>();
}
public string Name {get;set;}
public Dictionary<string,string> Props {get;set;}
}
public ActionResult SimpleGet(int key)
{
var x = new SuperObject("hello");
x.Props["a"] = "1";
x.Props["b"] = "2";
return Ok(x);
}
与OData配置有关的Startup.cs:
app.UseMvc(routeBuilder => {
routeBuilder.Select().Filter().OrderBy().MaxTop(100).Count();
var builder = new ODataConventionModelBuilder();
builder.EntitySet<RecordFile>("RecordFile");
var coll = builder.EntityType<RecordFile>().Collection;
fn = coll.Function("SimpleGet").Returns<SuperObject>();
fn.Parameter<int>("key");
var model = builder.GetEdmModel();
routeBuilder.MapODataServiceRoute("ODaTaroute","odata",model);
}
解决方法
尝试使用JsonConvert.Serialize()
方法并记录序列化的结果,然后再发送。
我试图在控制台应用程序中复制您的问题,但没有像您那样获得任何意外结果。这意味着您可能在其他地方做错了事。考虑可能给您带来意外输出的其他错误,例如:如果您的应用程序是.NET Core 3.0或更高版本=>您是否告诉应用程序将Newtonsoft与.AddNewtonsoftJson()
的{{1}}扩展方法一起使用>
Startup.cs
输出:(按预期)
static void Main(string[] args)
{
var obj = new SuperObject("appel");
obj.Props["a"] = "5";
obj.Props["b"] = "10";
var jsonText = JsonConvert.SerializeObject(obj);
Console.WriteLine(jsonText);
}
public class SuperObject
{
public SuperObject(string name)
{
Name = name;
Props = new Dictionary<string,string>();
}
public string Name { get; set; }
public Dictionary<string,string> Props { get; set; }
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。