使用C#访问JSON正文

问题描述

我需要使用C#访问JSON代码的主体。访问标头是可行的,但它不能与主体配合使用,而且我在网络上找不到任何内容我有这个JSON代码

    `{
        "Example": {
            "Header": [
                [
                    "Header1","Header2","Header3","Header4"
                ]
            ],"Body": [
                {
                    "Header1": "BlaBla","Header2": 0,"Header3": 20,"Header4": 32
                },{
                    "Header1": "BlaBlaBla","Header2": 22,"Header3": 35,"Header4": 25
                },......`

但是我可以使用以下代码访问标头:

JArray headers = locationsObject["Header"] as JArray; 
JArray header = headers.Last as JArray; //Last Header

如果我对主体执行相同操作,则为null:

JArray bodys = locationsObject["Body"] as JArray; //all bodys -> it works here
JArray body = bodys.First as JArray; //First body -> this one is null!!!

我需要体内的整数。我正在为此使用Newtonsoft。有人能帮助我吗?非常感谢!

解决方法

我建议您看看在C#中对json进行序列化/反序列化。
How to serialize and deserialize (marshal and unmarshal) JSON in .NET

如果您没有json json to c#的类表示形式

您的主代码行将如下所示:

exObj = JsonSerializer.Deserialize<ExampleObject>(jsonString); 

它将是:
字符串header1 = exObj.Body.Header1;

,

一种实现此目的的方法是使用C#的“动态”变量类型,该变量类型是专门为函数式编程语言设计的。它不是安全类型,也不是强类型,但是您可以访问结果中的所有值。

但是,我强烈建议您创建类,以模仿要尝试反序列化的json,因为它将为您提供强大的输入和智能感知能力。

这是一个如何使用动态的示例。您需要安装NewtonSoft.Json Nuget软件包才能使其正常运行。

using Newtonsoft.Json;
using System;

namespace JsonDeserialized
{
    class Program
    {
        static void Main(string[] args)
        {
            string json = @"{
        'Example':
            {   'Header':
                [
                    [
                        'Header1','Header2','Header3','Header4'
                    ]
                ],'Body':
                [
                    {
                        'Header1': 'BlaBla','Header2': 0,'Header3': 20,'Header4': 32
                    },{
                        'Header1': 'BlaBlaBla','Header2': 22,'Header3': 35,'Header4': 25
                    }
                ]
            }
        }";

            var result = JsonConvert.DeserializeObject<dynamic>(json);

            Console.WriteLine(result.Example);

            foreach (var header in result.Example.Header[0])
            {
                Console.WriteLine(header);
            }

            Console.WriteLine(result.Example.Header[0][0]);
        }
    }
}

该程序将打印以下结果。


{
  "Header": [
    [
      "Header1","Header2","Header3","Header4"
    ]
  ],"Body": [
    {
      "Header1": "BlaBla","Header2": 0,"Header3": 20,"Header4": 32
    },{
      "Header1": "BlaBlaBla","Header2": 22,"Header3": 35,"Header4": 25
    }
  ]
}
Header1
Header2
Header3
Header4
Header1

,

您的第一个正文不是 JArray 可能是问题的根源,而是 JObject ,您可以尝试以下代码,它应该可以正常工作

var bodys = locationsObject["Body"] as JArray;
var body = bodys[0];

您还可以使用linq-to-json进行更精细的操作。