c# - 将字符串转换为 JSON 对象
问题描述
我使用微软翻译 API 并尝试将答案转换为 JSON 对象以获取检测到的语言。
这是答案字符串
"[{\"language\":\"de\",\"score\":1.0,\"isTranslationSupported\":true,\"isTransliterationSupported\":false,\"alternatives\":[{\"language\":\"nl\",\"score\":1.0,\"isTranslationSupported\":true,\"isTransliterationSupported\":false},{\"language\":\"en\",\"score\":1.0,\"isTranslationSupported\":true,\"isTransliterationSupported\":false}]}]"
我需要第一个“语言”:“de”
我已经尝试使用 Newtonsoft JObject.Parse() 进行转换,但它确实有效
这是字符串打印到控制台时的样子:
[{"detectedLanguage":{"language":"de","score":0.8},"translations":[{"text":"Hallo Mein Name ist Danny","to":"de"},{"text":"Ciao il mio nome è Danny","to":"it"}]}]
这是 JObject.Parse(string); 打印的错误。
Newtonsoft.Json.JsonReaderException: Error reading JObject from JsonReader. Current JsonReader item is not an object: StartArray. Path '', line 1, position 1.
编辑:
这是 JSON 字符串来自的 HTTPRequest:
string TranslateText(string text)
{
string host = "https://api.cognitive.microsofttranslator.com";
string route = "/translate?api-version=3.0&to=de&to=it";
string subscriptionKey = COGNITIVE_SERVICES_KEY;
System.Object[] body = new System.Object[] { new { Text = @text } };
var requestBody = JsonConvert.SerializeObject(body);
using (var client = new HttpClient())
using (var request = new HttpRequestMessage())
{
// Set the method to POST
request.Method = HttpMethod.Post;
// Construct the full URI
request.RequestUri = new Uri(host + route);
// Add the serialized JSON object to your request
request.Content = new StringContent(requestBody, Encoding.UTF8, "application/json");
// Add the authorization header
request.Headers.Add("Ocp-Apim-Subscription-Key", subscriptionKey);
// Send request, get response
var response = client.SendAsync(request).Result;
var jsonResponse = response.Content.ReadAsStringAsync().Result;
// Print the response
return jsonResponse;
}
}
然后我尝试处理响应:
string json = TranslateText(text);
JArray jArray = JArray.Parse(json);
string firstLanguage = jArray[0]["language"].ToString();
响应是一个有效的 json,因为如果我将响应写入代码中它可以工作,但似乎我需要等到请求响应分配其结果。
解决方案
使用JsonConvert.Deserialize方法进行反序列化。
由于您试图反序列化为 JObject 它不会直接反序列化,因为您的 JSON 字符串包含一个数组,因此首先将其转换为 aList<JObject>
然后执行 a.FirstOrDefault()
以找出language
属性的值。
public class Program
{
public static void Main(string[] args)
{
string data = "[{\"language\":\"de\",\"score\":1.0,\"isTranslationSupported\":true,\"isTransliterationSupported\":false,\"alternatives\":[{\"language\":\"nl\",\"score\":1.0,\"isTranslationSupported\":true,\"isTransliterationSupported\":false},{\"language\":\"en\",\"score\":1.0,\"isTranslationSupported\":true,\"isTransliterationSupported\":false}]}]";
List<JObject> deserializedObject = JsonConvert.DeserializeObject<List<JObject>>(data);
string languageCode = deserializedObject.FirstOrDefault()["language"]?.ToString() ?? string.Empty;
Console.WriteLine(languageCode);
}
}
推荐阅读
- php - Foreach 循环只处理一个元素
- python - 按月查找每个组中最早的记录
- python - 打开文本文件时出现“OSError:[Errno 36] 文件名太长”
- apache - 带有问号的 URL 重定向
- javascript - 如何用javascript给某个td一个类名?
- javascript - 具有相同状态名称的多个组件,在父div上单击时更改一个而不影响其他人?
- hbase - 带空格的 Hbase 行键
- python - BigTable - 删除/跳过前 N 行
- powershell - 通过 Powershell 获取具有特定域的 Office 365 用户
- unity3d - 跳跃时重力不影响玩家