簡體   English   中英

從JSON數組中獲取特定的JSON數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM