C# 通过JSON标记读取JSON
我从一家身份检查公司获得了JSON格式的数据。我只需要从JSON文件中获取一些数据,所以我反序列化了JSON文件并尝试读取一个特定的标记。当我试图读取标记时,总是得到空值。下面是我的JSON文件和C#代码: 下面是我的代码:C# 通过JSON标记读取JSON,c#,json,json.net,C#,Json,Json.net,我从一家身份检查公司获得了JSON格式的数据。我只需要从JSON文件中获取一些数据,所以我反序列化了JSON文件并尝试读取一个特定的标记。当我试图读取标记时,总是得到空值。下面是我的JSON文件和C#代码: 下面是我的代码: var data = (JObject)JsonConvert.DeserializeObject(JSONResponse); string x = data["clientResponsePayload.orchestrationDecisions.sequence
var data = (JObject)JsonConvert.DeserializeObject(JSONResponse);
string x = data["clientResponsePayload.orchestrationDecisions.sequenceId"].Value<string>();
我不确定我做错了什么。这个JSON文件很大,有很多嵌套的JSON标记。以下是我如何读取身份检查公司发送给我的JSON文件:
HttpResponseMessage response = client.SendAsync(request).Result;
string responseContent = await response.Content.ReadAsStringAsync();
如果您创建一组这样的类来获取值,可能会更容易、更可读
public class ReponseObject
{
public Payload ClientResponsePayload { get; set; }
}
public class Payload
{
public List<Decisions> OrchestrationDecisions { get; set; }
}
public class Decisions
{
public string SequenceId { get; set; }
}
公共类响应对象
{
公共负载ClientResponsePayload{get;set;}
}
公共类有效载荷
{
公共列表编排决策{get;set;}
}
公共阶级决策
{
公共字符串SequenceId{get;set;}
}
然后像这样做:
ReponseObject jsonObject = JsonConvert.DeserializeObject<ReponseObject>(json);
string sequenceId = jsonObject.ClientResponsePayload.OrchestrationDecisions.First().SequenceId;
data["clientResponsePayload"]["orchestrationDecisions"][0]["sequenceId"].Value<string>()
ReponseObject jsonObject=JsonConvert.DeserializeObject(json);
string sequenceId=jsonObject.ClientResponsePayload.OrchestrationDecisions.First().sequenceId;
无论如何,如果您不想创建类,可以这样做:
ReponseObject jsonObject = JsonConvert.DeserializeObject<ReponseObject>(json);
string sequenceId = jsonObject.ClientResponsePayload.OrchestrationDecisions.First().SequenceId;
data["clientResponsePayload"]["orchestrationDecisions"][0]["sequenceId"].Value<string>()
data[“clientResponsePayload”][“orchestrationDecisions”][0][“sequenceId”]。Value()
您有几个问题
首先,“clientResponsePayload.orchestrationDecisions.sequenceId”
是一个。要通过JSONPath查询查询JObject
,您需要使用。您正在使用的只获取或设置带有指定属性名的JToken
,而不执行JSON层次结构的深层查询
其次,sequenceId
属性实际上嵌套在数组中,因此需要使用路径“clientResponsePayload.orchestrationDecisions[0].sequenceId”
来获取第一个。或者,您也可以使用带有*
通配符“clientResponsePayload.orchestrationDecisions[*].sequenceId”
的路径来获取所有序列ID
因此,您的代码应该是:
var x=data.SelectToken(“clientResponsePayload.orchestrationDecisions[0].sequenceId”)?.Value();
或者,不使用JSONPath查询,您可以使用如下方法将索引器链接在一起:
var x=data[“clientResponsePayload”]?[“orchestrationDecisions”]?[0]?[“sequenceId”]?.Value();
Demo fiddle.
orchestrationDecisions
是一个数组,而不是一个对象,也许这就是原因。根据您的建议,我尝试将代码更改为:data[“clientResponsePayload.orchestrationDecisions[0]”].Value()。仍然收到“System.ArgumentNullException”错误我的JSON不小。非常大的文件。我刚刚发布了一小部分JSON。我可以创建一个对象,但是我尝试的值嵌套在很多JSON标记中。谢谢。我一修改代码,它马上就起作用了。