从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。路径"α"…

我错过了什么吗?请建议。谢谢你。

从JSON中获取子集数据

首先,您还需要一个有效的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绑定到你的网格。