首页 > 解决方案 > 将字符串转换为 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,因为如果我将响应写入代码中它可以工作,但似乎我需要等到请求响应分配其结果。

标签: c#jsonstring

解决方案


使用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);
    }
}

推荐阅读