如何读取json数据

时间:2014-04-25 04:42:49

标签: c# .net json

我有以下 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)
{

}

3 个答案:

答案 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                    
    }
}