我有以下 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)
{
}
答案 0 :(得分:0)
您只获得一个元素,因为您正在选择JArray的索引0处的值
var items = entireJson["conditions"].Value<JArray>()[0];
使用返回IEnumerable
的值,而不是使用Value方法var items = entireJson["conditions"].Values<JObject>();
答案 1 :(得分:0)
据我所知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");
答案 2 :(得分:0)
我不确定为什么你需要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
}
}