Как я могу получить данные JSON в объекте C#?
Ниже мой класс для вывода JSON:
class PwdResetRequest
{
public class TopScoringIntent
{
public string intent { get; set; }
public double score { get; set; }
}
public class Intent
{
public string intent { get; set; }
public double score { get; set; }
}
public class Resolution
{
public string value { get; set; }
}
public class Entity
{
public string entity { get; set; }
public string type { get; set; }
public int startIndex { get; set; }
public int endIndex { get; set; }
public Resolution resolution { get; set; }
}
public class RootObject
{
public string query { get; set; }
public TopScoringIntent topScoringIntent { get; set; }
public List<Intent> intents { get; set; }
public List<Entity> entities { get; set; }
}
}
Луис Возвращение результата:
{
"query": "create a new password for sjao9841@demo.com",
"topScoringIntent": {
"intent": "ResetLANIDpassword",
"score": 0.9956063
},
"intents": [
{
"intent": "ResetLANIDpassword",
"score": 0.9956063
},
{
"intent": "None",
"score": 0.179328963
}
],
"entities": [
{
"entity": "sjao9841@demo.com",
"type": "builtin.email",
"startIndex": 26,
"endIndex": 47
}
]
}
Я разработал следующий код для получения данных от JSON.
var uri =
"https://westus.api.cognitive.microsoft.com/luis/v2.0/apps/" +
luisAppId + "?" + queryString;
var response = await client.GetAsync(uri);
var strResponseContent = await response.Content.ReadAsStringAsync();
var json = await response.Content.ReadAsStringAsync();
var token = JObject.Parse(json).SelectToken("entities");
foreach (var item in token)
{
var request = item.ToObject<Entity>();
}
// Display the JSON result from LUIS
Console.WriteLine(strResponseContent.ToString());
}
И я хочу только данные из "TopScoringIntent". Как я могу получить это с помощью C#? Ниже приведен код, который я пробовал, но ничего не вышло: Сообщение = Ошибка чтения JObject из JsonReader. Путь '', строка 0, позиция 0. Source=Newtonsoft.Json
2 ответа
Возможно, мне не хватает вашего намерения, но если вы заботитесь только о конкретном значении, а не обо всем объекте javascript, вы можете сделать следующее.
dynamic json = JsonConvert.Deserialize(data);
var score = json.TopScoringIntent.Score;
Это обеспечивает конкретное значение балла в пределах TopScoringIntent
, Очевидно, что вы также можете создать коллекцию, немного изменив ее.
foreach(var point in json.Intents)
Console.WriteLine($"{point[1]} or {point.score}");
Я считаю, что это то, что вы ищете, чтобы получить определенную ценность от вашего объекта. Обратите внимание, что динамика полезна, но этот подход довольно быстрый и грязный, может быть не идеальным для вашей реализации.
quicktype сгенерировал следующие классы C# и код маршалинга JSON.Net для ваших примеров данных:
// To parse this JSON data, add NuGet 'Newtonsoft.Json' then do:
//
// using QuickType;
//
// var pwdResetRequest = PwdResetRequest.FromJson(jsonString);
namespace QuickType
{
using System;
using System.Collections.Generic;
using System.Net;
using System.Globalization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using J = Newtonsoft.Json.JsonPropertyAttribute;
public partial class PwdResetRequest
{
[J("query")] public string Query { get; set; }
[J("topScoringIntent")] public Ntent TopScoringIntent { get; set; }
[J("intents")] public Ntent[] Intents { get; set; }
[J("entities")] public Entity[] Entities { get; set; }
}
public partial class Entity
{
[J("entity")] public string EntityEntity { get; set; }
[J("type")] public string Type { get; set; }
[J("startIndex")] public long StartIndex { get; set; }
[J("endIndex")] public long EndIndex { get; set; }
}
public partial class Ntent
{
[J("intent")] public string Intent { get; set; }
[J("score")] public double Score { get; set; }
}
public partial class PwdResetRequest
{
public static PwdResetRequest FromJson(string json) => JsonConvert.DeserializeObject<PwdResetRequest>(json, QuickType.Converter.Settings);
}
public static class Serialize
{
public static string ToJson(this PwdResetRequest self) => JsonConvert.SerializeObject(self, QuickType.Converter.Settings);
}
internal class Converter
{
public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
{
MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
DateParseHandling = DateParseHandling.None,
Converters = {
new IsoDateTimeConverter()
{
DateTimeStyles = DateTimeStyles.AssumeUniversal,
},
},
};
}
}
Теперь вы можете использовать System.Linq
чтобы получить максимум Ntent
от Score
:
var uri = $"https://westus.api.cognitive.microsoft.com/luis/v2.0/apps/${luisAppId}?${queryString}";
var response = await client.GetAsync(uri);
var json = await response.Content.ReadAsStringAsync();
var request = PwdResetRequest.FromJson(json);
var maxIntent = request.Intents.MaxBy(intent => intent.Score);
Вот сгенерированный код на игровой площадке, так что вы можете изменить названия типов и другие параметры.