【问题标题】:"SearchAsync" InvalidCastException Null object cannot be converted to a value type"SearchAsync" InvalidCastException Null 对象无法转换为值类型
【发布时间】:2021-07-01 18:06:44
【问题描述】:

我使用 Azure 搜索,搜索索引中的字段可以为空。

这意味着我的代码
var result = await searchIndexClient.Documents.SearchAsync<SearchEntity>(query, parameters);
抛出异常 “InvalidCastException Null 对象无法转换为值类型。”
对于 Csharp:

public class SearchEntity{
  ...
  boolean NewField{ get; set; }
  ...
}

和索引文档:

{
    "@odata.context": "...",
    "value": [
        {
            "@search.score": 1,
            ...
            "NewField": null,
     ...

如果接收到的字段为空,我想告诉SearchAsync(?) 为SearchEntity 中的属性设置一个默认值。

有可能吗?

(我知道我可以收到 null 并在以后默认它,但这样做有什么乐趣?)

【问题讨论】:

  • “SearchEntity”类似乎是您自己的类 - 您不能修改该类以允许某些字段为空值并在其中设置默认值吗?
  • 请编辑您的问题并提供有关您的SearchEntity的详细信息。
  • @ramero-MSFT 我可以,但这有什么好玩的?

标签: azure-cognitive-search


【解决方案1】:

一种可能的解决方案是在您的实体中定义默认值,并告诉 JSON 序列化程序在序列化时忽略源中的空值。

例如,考虑以下实体定义:

public class SearchEntity
{
    [JsonProperty(PropertyName = "newField")]
    public bool NewField { get; set; } = true;

    [JsonProperty(PropertyName = "dateTime")]
    public DateTime DateTime { get; set; } = DateTime.Now.Date;
}

这是序列化的代码。我为此使用 NewtonSoft.Json 并指示它忽略空值:

string json = "{\"newField\": false, \"dateTime\": null}";

JsonSerializerSettings settings = new JsonSerializerSettings()
{
    NullValueHandling = NullValueHandling.Ignore
};

var searchEntity = JsonConvert.DeserializeObject<SearchEntity>(json, settings);

Console.WriteLine($"SearchEntity.NewField: {searchEntity.NewField}");//Prints "true"
Console.WriteLine($"SearchEntity.DateTime: {searchEntity.DateTime.ToString("u")}");//Prints current date e.g. "2021-07-01 00:00:00Z"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-24
    • 2020-12-02
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    相关资源
    最近更新 更多