.NET Core 3.0 WebApi(JsonSerialize)无法序列化嵌套对象/所有对象信息

5
我有一个对象列表,类型为 IEnumerable<IHit<Header>>,但是.NET Core 3.0没有发出所有信息,当我返回列表中单个对象 IHit 时,比如 obj.ElementAt(0)

{"explanation":null,"fields":null,"highlight":{},"id":"123","index":"ky","innerHits":{},"matchedQueries":[],"nested":null, "primaryTerm":null, "routing":null, "score":10.98915, "sequenceNumber":null, "sorts":[],"source":{"timeStamp":"2019-05-16T06:16:07Z", "result":"PASS","testTimeStart":"20190516141559","testTimeEnd":"20190516141607","barcode":"XXRX8762"},"type":"_doc","version":0}

而当我返回整个列表时:

[{"explanation":null,"fields":null,"highlight":{},"innerHits":{},"matchedQueries":[],"nested":null,"score":10.98915,"sorts":[]}]

甚至尝试显式调用 JsonSerializer 也没能解决问题。
string s = JsonSerializer.Serialize(result, typeof(IEnumerable<IHit<Header>>), obj);

总结:

  1. WebApi 正常工作并正确地序列化返回单个对象:

    public IHit<Header> Get(string id)

但当处理列表时,则不是这样。

public IEnumerable<IHit<Header>> GetAll()

我尝试使用 IEnumerable、IList 和 List,但结果都相同!

  1. JsonSerializer 无论是单个对象还是列表都无法工作。
5个回答

20

我仍然不知道当我只发出一个对象而不是列表时所面对的奇怪行为。

但是以下是基于@poke的答案和@NeilMacMullen的评论解决问题的方法。

  1. 添加包Microsoft.AspNetCore.Mvc.NewtonsoftJson
  2. 在Startup.cs中添加

    services.AddControllers().AddNewtonsoftJson();


4
我认为微软将其半成品序列化程序作为.NET Core 3.0项目的默认解决方案,这一点非常荒谬。虽然它确实比Newtonsoft快两倍,但代价是失去了不到一半的功能。 - mg30rg
2
截至2022年6月,我正在使用dotnet 6,但它不起作用...让我非常沮丧。 - B.W
@B.W,我已经在.NET Core 3.0上使用了这段代码,不清楚.NET 6。 - Abdulkarim Kanaan

6

在 .Net 6 中添加属性 [JsonInclude],以便序列化列表。

例如:

   [JsonInclude]
   public List<StaffEarningDetail> EarningDetails;

2
如果你正在使用Newtonsoft.Json,那么请按照以下步骤操作:
public void ConfigureServices(IServiceCollection services)
{
    ...

    services.AddMvc()
        .AddJsonOptions(
            options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
        );

    ...
}

如果您没有使用Newtonsoft.Json,请按照以下步骤进行操作:

public void ConfigureServices(IServiceCollection services)
{
    ...

   services.AddMvc().AddJsonOptions(option => option.JsonSerializerOptions.MaxDepth = 2);

    ...
}

更多详细信息请参见:相关数据和序列化

0

JsonSerializer 可能不知道如何序列化 IHit<T>。我建议采用以下方案之一:

从 Elasticsearch 获取 JSON string 响应,使用以下方法之一:

  1. 使用低级客户端,在高级客户端上公开为 .LowLevel 属性。您可以使用 PostData.Serializable(request) 序列化高级请求类型
  2. 使用 OnRequestCompleted() 并在请求或全局的 ConnectionSettings 上设置 DisableDirectStreaming()

或者

将 Elasticsearch 的响应映射到另一个 JsonSerializer 可以序列化的类型。


谢谢,我会尝试使用JsonSerializer。但是为什么WebApi能够正确序列化返回单个对象IHit<Header>,但返回整个列表IEnumerable<IHit<Header>>时却不能呢? - Abdulkarim Kanaan
我恐怕不知道,脑海中没有这个信息。 - Russ Cam

0
在我的情况下,我不小心在ViewModel类属性中写了一个内部设置函数如下; public int CampaignServiceFee { get; internal set; }
只需删除internal关键字,这样类外的JsonSerializer就可以设置值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接