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



*编辑:事实证明这与在OData控制器上有关。从startup.cs.在下面添加OData配置

免责声明:我今晚没有时间制作一个真正的最小可复制版本的代码。我刚刚从我的大型项目中提取了OData设置。很抱歉我将尝试在周一返回,创建一个真正的最小可复制版本。

我正试图以以下基本格式返回一个JSON:

{ "Name": "hello", Props: { "a":"1", "b":"2" }}

Props是一个Dictionary;正常的";控制器,它按预期工作。但在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或更高版本=>您是否告诉您的应用程序在Startup.cs中使用Newtonsoft和.AddNewtonsoftJson()扩展方法

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; }
}

输出:(如预期(

// {"Name":"appel","Props":{"a":"5","b":"10"}}

最新更新