如何读取json数据
本文关键字:json 数据 读取 何读取 | 更新日期: 2023-09-27 18:00:06
我有以下json数据,我需要从中读取数据,然后他们进行一些比较。
{"expiration": "2013-04-01T00:00:00Z",
"conditions": [
{"bucket": "the-s3-bucket-in-question"},
["starts-with", "$key", "donny/uploads/"],
{"acl": "private"},
["eq", "$Content-Type", "text/plain"],
["starts-with", "x-amz-meta-yourelement", ""],
["content-length-range", 0, 1048576]
]
}
通过使用以下代码,我找到了第一个元素
var policy = Encoding.UTF8.GetString(policyByteArray);
JObject obj = JObject.Parse(policy);
string policyexpiration = obj.First.First.Path;
我已经使用JToken
来查找所有条件,但我只得到该数组中的一个元素。你能帮我把条件中的所有元素都准备好吗。以下是我使用JToken
的方式
JToken entireJson = JToken.Parse(policy);
var items = entireJson["conditions"].Value<JArray>()[0];
XmlDocument xdoc = (XmlDocument)JsonConvert.DeserializeXmlNode(items.ToString(), "root");
XmlNode xmlarray = xdoc.GetElementsByTagName("root")[0];
foreach (XmlNode xmlelement in xmlarray)
{
}
我不确定您为什么需要XML工具。使用json.NET迭代json结构中的"条件"很简单,而且已经非常接近了。
var items = entireJson["conditions"].Value<JArray>();
foreach (JToken condition in items)
{
//do work on one condition here
}
请注意,这个json结构有点奇怪。单个条件可以是诸如["starts-with", "$key", "donny/uploads/"]
之类的数组,也可以是诸如{"bucket": "the-s3-bucket-in-question"}
之类的对象。
根据你想对这种情况做什么,你可能需要区分两者。您可以将C#的is
运算符与Json.NET类型一起使用,如以下所示:
var items = entireJson["conditions"].Value<JArray>();
foreach (JToken condition in items)
{
if (condition is JArray)
{
//do something with the array
}
else if (condition is JObject)
{
//do something with the object
}
}
您只得到一个元素,因为您选择了JArray 索引0处的值
var items = entireJson["conditions"].Value<JArray>()[0];
不要使用Value方法,而是使用返回IEnumerable 的Values
var items = entireJson["conditions"].Values<JObject>();
据我所知,DeserializeXmlNode()
只接受表示JSON对象的字符串。这就是为什么当您只传递conditions
属性的第一个值时它有效:
var items = entireJson["conditions"].Value<JArray>()[0];
XmlDocument xdoc = JsonConvert.DeserializeXmlNode(items.ToString(), "root");
但如果您传递conditions
的整个值或第二个值,则抛出异常,因为两者都表示JSON数组而不是JSON对象:
//pass entire value
var items = entireJson["conditions"].Value<JArray>();
//or pass the second value : ["starts-with", "$key", "donny/uploads/"]
var items = entireJson["conditions"].Value<JArray>()[1];
XmlDocument xdoc = JsonConvert.DeserializeXmlNode(items.ToString(), "root");
目前还不清楚您希望从给定的JSON字符串中创建什么样的XML格式。但是,为了使它发挥作用,您可以尝试创建另一个JSON对象,该对象具有一个名为conditions
的属性,该属性的值复制自初始JSON:
var items = entireJson["conditions"].Value<JArray>();
var newObject = string.Format("{{conditions : {0}}}", items.ToString());
XmlDocument xdoc = (XmlDocument)JsonConvert.DeserializeXmlNode(newObject, "root");