微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ASP.NET核心OData:将包含字典的类序列化为JSON,字典成为键值对的数组需要它成为一个对象

如何解决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 举报,一经查实,本站将立刻删除。