我有一个.net应用程序,我想用它来查询elasticsearch。我正在成功查询我的elasticsearch索引。结果类似于:
{
"took":31,
"timed_out":false,
"_shards": {
"total":91,
"successful":91,
"skipped":0,
"failed":0
},
"hits":{
"total":1,
"max_score":1.0,
"hits":[
{
"_index":"my-index",
"_type":"doc",
"_id":"TrxrZGYQRaDom5XaZp23",
"_score":1.0,
"_source":{
"my_id":"65a107ed-7325-342d-adab-21fec0a97858",
"host":"something",
"zip":"12345"
}
},
]
}
}
现在,这些数据可以通过 Body
上的属性 StringResponse
我从elasticsearch回来了。我想反序列化实际记录(我不想或不需要 took
, timed_out
,等属性)转换为名为 results
. 为了做到这一点,我有:
var results = JsonConvert.DeserializeObject<List<Result>>(response.Body);
这个 Result
类如下所示:
public class Result
{
[JsonProperty(PropertyName = "my_id")]
public string Id { get; set; }
[JsonProperty(PropertyName = "host")]
public string Host { get; set; }
[JsonProperty(PropertyName = "zip")]
public string PostalCode { get; set; }
}
运行此操作时,出现以下错误:
无法将当前json对象反序列化为类型“system.collections.generic.list”“1[result]”,因为该类型需要json数组才能正确反序列化。
虽然这个错误有道理,但我不知道如何解析 hits
只提取 _source
数据。这个 _source
属性包含要反序列化的数据。其他的都是我不在乎的元数据。
有办法吗?如果是,怎么做?
5条答案
按热度按时间nle07wnf1#
尝试使用vs特殊粘贴功能生成的以下结构:
mfpqipee2#
好吧,你是
DeserializeObject
T
与json不匹配。您的json以{
所以你的t必须是一个类(不是IEnumerable
类型)。让我们从外面开始,一路走进去:
所以:
下一个是
_shards
```"_shards": {
"total":91,
"successful":91,
"skipped":0,
"failed":0
},
public class Shards
{
[JsonProperty("total")]
public int Total { get; set; }
// etc...
}
所以
那么
Hits
列表:所以
一旦你创建了所有你需要的,然后你反序列化:
cgfeq70w3#
您需要首先反序列化为泛型
JToken
或者JObject
,如下所示:然后您可以导航到保存您感兴趣的数据的\u source属性:
1sbrub3j4#
我曾经http://json2csharp.com/ 为了将json转换成c类,在我的测试中,我从上的转换中得到了一个json字符串http://easyonlineconverter.com/converters/dot-net-string-escape.html
然后我用这个类创建了一个控制台应用程序:
希望这有帮助
s5a0g9ez5#
您可以使用json.net的linq to json api仅获取感兴趣的节点,然后将这些节点转换为结果列表:
工作演示:https://dotnetfiddle.net/okeppa