[英]Get specific JSON data from JSON array
我有一個從XML轉換的JSON數組,我想知道如何獲取JSON的一部分。
從另一個答案我發現
var result =
JObject.Parse(jsonResult).Children().Children().Children().ElementAt(1).Children().First();
但這僅使我成為JSON的一部分,而且很難弄清楚如何獲得其他部分。
這是我從上面的代碼中得到的部分
http://www.w3.org/2001/XMLSchema-instance
這是JSON
{
"soap12:Envelope": {
"@xmlns:soap12": "http://www.w3.org/2003/05/soap-envelope",
"@xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance",
"@xmlns:xsd": "http://www.w3.org/2001/XMLSchema",
"soap12:Body": {
"ProcessRequestResponse": {
"@xmlns": "http://localhost/TestServices",
"ProcessRequestResult": {
"StatusCode": "None or GE or PE or PW or NP or FS or NA or GF",
"Success": "boolean",
"Errors": {
"Error": [
{
"Code": "int",
"ErrorText": "string",
"ErrorType": "None or Critical or Non_Critical",
"Severity": "Warning or Error"
},
{
"Code": "int",
"ErrorText": "string",
"ErrorType": "None or Critical or Non_Critical",
"Severity": "Warning or Error"
}
]
}
}
}
}
}
}
我希望能夠獲取“ StatusCode”或“ Success”或數組中的任何內容。
我建議不要直接使用JObject.Parse
,而是直接反序列化為自己的類層次結構。 例如,使用一組簡單的類,例如:
public class SoapObject
{
[JsonProperty("soap12:Envelope")]
public SoapData Envelope { get; set; }
}
public class SoapData
{
[JsonProperty("soap12:Body")]
public SoapBody Body { get; set; }
}
public class SoapBody
{
public ProcessRequestResponse ProcessRequestResponse { get; set; }
}
public class ProcessRequestResponse
{
public ProcessRequestResult ProcessRequestResult { get; set; }
}
public class ProcessRequestResult
{
public string StatusCode { get; set; }
public string Success { get; set; }
}
您可以簡單地反序列化:
var soapObject = JsonConvert.DeserializeObject<SoapObject>(jsonResult);
現在,您已經對需要的屬性進行了強類型訪問:
var statusCode = soapObject.Envelope.Body
.ProcessRequestResponse.ProcessRequestResult.StatusCode;
DavidG的答案足夠好,但是如果您想知道如何訪問json數據,請使用JObject
var jo = JObject.Parse(myJsonString);
var status = jo["soap12:Envelope"]["Success"];
命名空間正在using Newtonsoft.Json.Linq;
用JObject.Parse()獲取它們
string jsonresult = "{\"soap12:Envelope\":{\"@xmlns:soap12\":\"http://www.w3.org/2003/05/soap-envelope\",\"@xmlns:xsi\":\"http://www.w3.org/2001/XMLSchema-instance\",\"@xmlns:xsd\":\"http://www.w3.org/2001/XMLSchema\",\"soap12:Body\":{\"ProcessRequestResponse\":{\"@xmlns\":\"http://localhost/MeetingBrokerServices\",\"ProcessRequestResult\":{\"StatusCode\":\"None or PAR or PNE or PWE or NPE or FSR or NAC or TF\",\"Success\":\"boolean\",\"Errors\":{\"Error\":[{\"Code\":\"int\",\"ErrorText\":\"string\",\"ErrorType\":\"None or Critical or Non_Critical\",\"Severity\":\"Warning or Error\"},{\"Code\":\"int\",\"ErrorText\":\"string\",\"ErrorType\":\"None or Critical or Non_Critical\",\"Severity\":\"Warning or Error\"}]}}}}}}";
var result = JObject.Parse(jsonresult);
Console.WriteLine(result["soap12:Envelope"]["soap12:Body"]["ProcessRequestResponse"]["ProcessRequestResult"]["Success"]);
返回“布爾值”作為結果。 但是請使用DavidG的建議,因為這顯然不是很整潔。
反序列化到一個類通常是最好的方法,但是另一種替代方法是JSONPath query :
var jo = JObject.Parse(json);
string StatusCode = (string)jo.SelectToken("$..StatusCode");
string[] ErrorCodes = jo.SelectTokens("$..Code").Select(t => (string)t).ToArray();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.