C# 将字符串转换为JSON对象

C# 将字符串转换为JSON对象,c#,json,string,C#,Json,String,我使用microsoft translator API并尝试将答案转换为JSON对象以获取检测到的语言 这是答案字符串 "[{\"language\":\"de\",\"score\":1.0,\"isTranslationSupported\":true,\"isTransliterationSupported\":false,\"alternatives\":[{\"language\":\"nl\",\"score\":1.0,\"isTranslationSupported\":true

我使用microsoft translator 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}]}]"
我需要第一种“语言”:“德”

我尝试使用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)打印的错误

编辑:

这是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,因为如果我将响应写入代码中,它会工作,但似乎需要等待请求响应分配其结果。

尝试以下方法:

string str = "[{\"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}]}]";

dynamic arr = JsonConvert.DeserializeObject(str);

string language = arr[0].language;
语言价值:

“德”

使用该方法进行反序列化

由于您试图反序列化为JObject,因此它不会直接反序列化,因为JSON字符串包含数组,因此请先将其转换为
列表
,然后执行
.FirstOrDefault()
以查找
语言
属性的值

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);
    }
}
公共类程序
{
公共静态void Main(字符串[]args)
{
string data=“[{”language\”:“de\”,“score\”:1.0,“isTranslationSupported\”:true,“'isTranslationSupported\”:false,“'Alternations\”:[{”language\“:“nl\”,“score\”:1.0,“'isTranslationSupported\”:true,“'isTranslationSupported\”:false},“{”language\:“en\”,“score\”:1.0,“:isTranslationSupported\”:true,“:isTranslationSupported\”:false}]";
List deserializedObject=JsonConvert.DeserializeObject(数据);
string languageCode=deserializedObject.FirstOrDefault()[“语言”]?.ToString()???string.Empty;
Console.WriteLine(语言代码);
}
}

您与
JObject
几乎接近了

但是您的json不是一个对象,而是一个对象数组,因此您需要
JArray
来成功解析它

1) 将其解析为
JArray

2) 通过查询
JArray
,您可以使用索引0获取第一语言

string json = @"[{""detectedLanguage"":{""language"":""de"",""score"":0.8},""translations"":[{""text"":""Hallo Mein Name ist Danny"",""to"":""de""},{""text"":""Ciao il mio nome è Danny"",""to"":""it""}]}]";

JArray jArray = JArray.Parse(json);

string firstLanguage = jArray[0]["detectedLanguage"]["language"].ToString();
输出:(来自调试器)


“我已经尝试使用Newtonsoft JObject.Parse()进行转换,但引号是错误的。”这是什么意思?执行
JObject.Parse()
操作后出现的错误消息是什么?看起来您可以用常规引号char
替换
”“
然后使用JSONConverter,那么这些反斜杠是否真的存在于JSON中,或者这正是您在调试器中看到的?(如果将其打印到控制台,您会看到什么?)您不能对此使用
JObject.Parse
,因为这里的根是数组,而不是对象,正如
[…]
根所示。您可以使用
JToken.Parse
,但您也可以使用
jsonvert.DeserializeObject
,正如Marco在回答中所示。这应该可以很好地工作,谢谢。只需修复我的json字符串是发送HTTP Post的方法的返回,因此我需要等待结果,否则字符串为null。好的,但这里的等待实际上是什么意思=>所以我需要等待结果,否则字符串为null。你的意思是异步等待吗?如果我“jArray=jArray.Parse(jsonString);”我总是得到一个“对象引用未设置为对象的实例”-错误。但是json字符串在那里,因为我可以在之前打印它。请复制我的代码,因为它在新的类文件中。让我知道它是否有效,或者让我知道你是如何在你的终端集成我的代码的。我集成了你的代码,但我没有通过硬代码分配json字符串,因为我将json作为httpRequestMessage的响应。如果我像您一样分配json字符串,它就会工作。
string json = @"[{""detectedLanguage"":{""language"":""de"",""score"":0.8},""translations"":[{""text"":""Hallo Mein Name ist Danny"",""to"":""de""},{""text"":""Ciao il mio nome è Danny"",""to"":""it""}]}]";

JArray jArray = JArray.Parse(json);

string firstLanguage = jArray[0]["detectedLanguage"]["language"].ToString();