C# 将字符串转换为JSON对象
我使用microsoft translator API并尝试将答案转换为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
"[{\"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();