如何读取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)
{
}

如何读取json数据

我不确定您为什么需要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");