从JSON中获取子集数据
本文关键字:子集 数据 获取 JSON | 更新日期: 2023-09-27 18:04:37
我有以下有效的JSON数据(从http://jsonlint.com/):
测试){
"alpha": {
"one": 1,
"two": "2"
},
"bravo": {
"sample1": {
"one": "1",
"two": "2",
"three": 3
},
"sample2": [
{
"id": 123,
"content": "alpha",
"photos": [
{
"caption": "photo1",
"location": [
{
"url": "http://website.com/abc.jpg",
"width": 800,
"height": 600
},
{
"url": "http://website.com/def.jpg",
"width": 800,
"height": 600
}
]
},
{
"caption": "photo2",
"location": [
{
"url": "http://website.com/ghi.jpg",
"width": 800,
"height": 600
},
{
"url": "http://website.com/jkl.jpg",
"width": 800,
"height": 600
}
]
}
]
},
{
"id": 456,
"content": "bravo",
"photos": [
{
"caption": "photo3",
"location": [
{
"url": "http://website.com/mno.jpg",
"width": 800,
"height": 600
},
{
"url": "http://website.com/pqr.jpg",
"width": 800,
"height": 600
}
]
},
{
"caption": "photo4",
"location": [
{
"url": "http://website.com/stu.jpg",
"width": 800,
"height": 600
},
{
"url": "http://website.com/vwx.jpg",
"width": 800,
"height": 600
}
]
}
]
}
]
}
}
我想把JSON数据传递给一个数据集,这样我就可以从GridView控件显示它。
是否有一种方法可以只显示在"sample2"中找到的值,我可以显示以下内容:
id content caption url
123 alpha photo1 http://website.com/abc.jpg
456 bravo photo3 http://website.com/mno.jpg
我使用JSON。. NET的JsonConvert将数据集的值传递给GridView控件
DataSet ds = new DataSet();
ds = JsonConvert.DeserializeObject<DataSet>("JSON file here");
GridView.DataBind();
但是收到一个错误:
读取DataTable时意外的JSON令牌。预期的StartArray,收到StartObject。路径"α"…
我错过了什么吗?请建议。谢谢你。
首先,您还需要一个有效的class
供JSON解析。类似这样的代码(感谢json2sharp):
public class Alpha
{
public int one { get; set; }
public string two { get; set; }
}
public class Sample1
{
public string one { get; set; }
public string two { get; set; }
public int three { get; set; }
}
public class Location
{
public string url { get; set; }
public int width { get; set; }
public int height { get; set; }
}
public class Photo
{
public string caption { get; set; }
public List<Location> location { get; set; }
}
public class Sample2
{
public int id { get; set; }
public string content { get; set; }
public List<Photo> photos { get; set; }
}
public class Bravo
{
public Sample1 sample1 { get; set; }
public List<Sample2> sample2 { get; set; }
}
public class RootObject
{
public Alpha alpha { get; set; }
public Bravo bravo { get; set; }
}
下一个你的JSON.net
调用是错误的,它应该看起来像这样:
DataSet ds = new DataSet();
var root = JsonConvert.DeserializeObject<RootObject>("JSON String here"); // not the file!
// Insert here some magic to convert your RootObject to DataSet
还有你的问题:
是否有一种方法可以只显示在"sample2"中找到的值,我可以显示以下
是一个简单的NO。你必须重组你的JSON模型或解析RootObject
到一个合适的ViewModel。
您不需要为不需要的数据创建类,您可以直接访问您需要的部分:
JObject jsonTree = JObject.Parse(json);
var sample2 = jsonTree["bravo"]["sample2"].ToString();
List<Sample2> data = JsonConvert.DeserializeObject<Sample2>(sample2);
类需要:
public class Photo
{
public string caption { get; set; }
public List<Location> location { get; set; }
}
public class Sample2
{
public int id { get; set; }
public string content { get; set; }
public List<Photo> photos { get; set; }
}
那么你可以很容易地将data
绑定到你的网格。