加入JSON和Dataset

时间:2018-01-11 23:00:36

标签: c# json dataset

我有一个来自Mysql查询的数据集,我需要在点击HTTP端点之前重新构建一些附加信息。所需的输出如下所示:

{
  "data": [
    {
      "reference_id": 19,
      "category": 2,
      "title": "Unconfirmed",
      "code": "Unconfrm"
    },
    {
      "reference_id": 20,
      "category": 2,
      "title": "Left Msg",
      "code": "LeftMsg"
    }
  ],
  "meta": {
    "firstRecord": 0, //for pagination
    "lastRecord": 2,  //for pagination
    "page": 1,        //for pagination
    "sync": "null"    //internal use
  }
}

我从以下内容返回data元素:

public class DataConnection
{
    public static DataSet ExecuteQuery(string strQuery)
    {
        DataSet ds = new DataSet();

        using (MySqlConnection mySqlConnection = new MySqlConnection("server=localhost;uid=root;database=sampledb"))
        {
            mySqlConnection.Open();

            using (MySqlDataAdapter dataAdapter = new MySqlDataAdapter(strQuery, mySqlConnection))
            {
                dataAdapter.TableMappings.Add("Table", "data");

                dataAdapter.Fill(ds);
            }

            mySqlConnection.Close();
        }
        return ds;
    }
}

我需要填充meta部分,但无法弄清楚如何。我将数据集转换为JObject和JArray并且能够计算结果,虽然我还没有实现分页,但我很快就会。无论哪种方式,问题是我如何使用meta对象从Mysql加入DataSet? .Add()方法似乎不能在根级别工作,只有当我尝试在data元素下添加它时才会起作用。

我正在尝试这条线:

DataSet definitionsReturned = DataConnection.ExecuteQuery("SELECT DefNum AS reference_id, Category AS category, ItemName AS title, ItemValue AS code from definition WHERE category IN(2,13) ORDER BY category");
        string meta = @"[{
            'firstRecord': 0,
            'lastRecord': 27,
            'page': 1,
            'sync': 'null'
        }]";
        DataSet myDataSet = JsonConvert.DeserializeObject<DataSet>(meta);
        definitionsReturned.Merge(myDataSet);
        string json = JsonConvert.SerializeObject(definitionsReturned);

        //also tried this
        // JArray jsonArray = (JArray) jsonParsed[0];  //also tried this
        //jsonArray.Add(myDataSet);

1 个答案:

答案 0 :(得分:1)

您可以创建一个包含数据集和元数据的类:

public class MyReturnObject {
    public List<MyDataObject> Data { get; set; }
    public Metadata Meta { get; set; }
}

public class Metadata {
    public int FirstRecord { get; set; }
    public int LastRecord { get; set; }
    public int Page { get; set; }
    public WhateverType Sync { get; set; }
}

请注意,您还可以按照here所述的ExecuteQuery直接获取已列入结果的列表。

就像你必须做的那样:

List<MyDataObject> definitionsReturned = DataConnection.ExecuteQuery<MyDataObject>("SELECT DefNum AS reference_id, Category AS category, ItemName AS title, ItemValue AS code from definition WHERE category IN(2,13) ORDER BY category").ToList();

MyReturnObject res = new MyReturnObject {
    Data = definitionsReturned,
    Meta = new Metadata {
        FirstRecord = 0,
        LastRecord = 27,
        Page = 1,
        Sync = null
    }
};

string json = JsonConvert.SerializeObject(res);