从JSON数组中获取特定的JSON数据

时间:2019-07-10 08:32:56

标签: c# json

我有一个从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”或数组中的任何内容。

4 个答案:

答案 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();