gpt4 book ai didi

json - Elasticsearch.NET (NEST) 在版本 7.x 中无法反序列化我的 POCO JSON

转载 作者:行者123 更新时间:2023-12-04 04:23:38 26 4
gpt4 key购买 nike

适用于 .NET 的 Elasticsearch 7.x has a documented breaking change with the internal Utf8 JSON serializer .

我没有使用另一个选项 -> Newtonsoft 的 Json.NET 序列化程序,而是试图找出我的 JSON 的哪一部分破坏了序列化程序。

  • 客户端 nuget:7.3.1
  • 服务器:7.2.0

首先,错误感觉很有帮助,但我认为它真的没有帮助:

2019-10-18 17:15:33 ERR Fatal error.
Elasticsearch.Net.UnexpectedElasticsearchClientException: expected:'String Begin Token', actual:'2', at offset:540 ---> Elasticsearch.Net.Utf8Json.JsonParsingException: expected:'String Begin Token', actual:'2', at offset:540
at Elasticsearch.Net.Utf8Json.JsonReader.ReadStringSegmentCore(Byte[]& resultBytes, Int32& resultOffset, Int32& resultLength)
at Elasticsearch.Net.Utf8Json.JsonReader.ReadString()
at Deserialize(Object[] , JsonReader& , IJsonFormatterResolver )
at Elasticsearch.Net.Utf8Json.JsonSerializer.Deserialize[T](Byte[] bytes, Int32 offset, IJsonFormatterResolver resolver)
at Elasticsearch.Net.Utf8Json.JsonSerializer.Deserialize[T](Stream stream, IJsonFormatterResolver resolver)
at Elasticsearch.Net.DiagnosticsSerializerProxy.Deserialize[T](Stream stream)
at Nest.SourceFormatter`1.Deserialize(JsonReader& reader, IJsonFormatterResolver formatterResolver)
at Deserialize(Object[] , JsonReader& , IJsonFormatterResolver )
at Nest.ReadAsFormatter`2.Deserialize(JsonReader& reader, IJsonFormatterResolver formatterResolver)
at Elasticsearch.Net.Utf8Json.Formatters.CollectionFormatterBase`4.Deserialize(JsonReader& reader, IJsonFormatterResolver formatterResolver)
at Deserialize(Object[] , JsonReader& , IJsonFormatterResolver )
at Nest.ReadAsFormatter`2.Deserialize(JsonReader& reader, IJsonFormatterResolver formatterResolver)

... etc ...

因此在字符 540 处,出现了问题。

所以我认为我有返回的 json。我认为是因为我请同事使用 Fiddler 并给我有效负载结果。我无法将完整的有效负载粘贴到任何地方,因为它包含敏感内容,但这是第 540 行代码的一部分

enter image description here

那里没有“2”。

那么 Json 呢?这是一个格式很好的 json 屏幕截图,其中隐藏了自定义结果:

enter image description here

最后是 poco 部分,我认为部分是错误的(但我不确定):

        [Keyword(Index = false)]
public string Street { get; set; }

[Keyword]
public string Suburb { get; set; }

[Keyword]
public string State { get; set; }

[Keyword]
public string StateCode { get; set; }

[Keyword]
public string Country { get; set; }

[Keyword]
public string Postcode { get; set; }

[GeoPoint]
public GeoLocation LatLong { get; set; }

所以:

  • 我不确定如何获取由 NEST 解析的确切 json。是我抓取的 json,可以通过我提供的代码片段来确认吗?
  • 如果我将此 JSON 有效负载保存到文件以便进一步调试,是否有一种方法可以手动创建单元测试 + 使用带有 NEST 的内部 Utf8 序列化程序来加载我的 json?

最佳答案

问题与枚举有关。 Out ES DB 有一些带有 number/int 的文档子集值,而我们的 POCO 有一个 string值(value)。字符串值是我们枚举的字符串表示,而 int 值是枚举的先前 int 表示。

public class Foo
{
public string statusType { get; set }
}

要弄清楚错误是什么,我需要执行以下操作:

  • 克隆 ES 存储库并在 ES 的 JsonSerializer 中放置一个断点Deserialize<T>方法,因为 SourceLink 在 ES nuget 包上未启用(截至本文发布时)。
  • 更新将字节数组转换为字符串的方法,以便在它尝试反序列化为我们的 POCO 之前,我可以看到 JSON 负载是什么。
  • 单步执行代码,最终到达断点并查看 json 负载是什么。

所以错误消息是关于我文档的 json 的。不是整个 json ES 负载。在上面的示例中,我有 5 个“命中”(文档段),因此 Deserialize每个文档段被命中 1 倍。当它命中带有 int 的段时值(应该是 string 值)然后崩溃了。所以我现在可以看到 char 540 处的错误是什么是和中提琴....

  "statusType": 2,

这是不好的。应该是:

  "statusType": "available",

所以 - 问题已确定。

关于json - Elasticsearch.NET (NEST) 在版本 7.x 中无法反序列化我的 POCO JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58445455/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com