我有一个从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”或数组中的任何内容。
答案 0 :(得分:3)
我建议不要直接使用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;
答案 1 :(得分:0)
DavidG的答案足够好,但是如果您想知道如何访问json数据,请使用JObject
var jo = JObject.Parse(myJsonString);
var status = jo["soap12:Envelope"]["Success"];
命名空间为using Newtonsoft.Json.Linq;
答案 2 :(得分:0)
通过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的建议,因为这显然不是很整洁。
答案 3 :(得分:0)
反序列化到一个类通常是最好的方法,但是另一种选择是JSONPath query:
var jo = JObject.Parse(json);
string StatusCode = (string)jo.SelectToken("$..StatusCode");
string[] ErrorCodes = jo.SelectTokens("$..Code").Select(t => (string)t).ToArray();