问题描述
我需要使用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进行更精细的操作。