如何使用C#API将BigQuery行转换为JSON



我使用以下C#

中的代码从BigQuery表中摘取一些数据
        BigQueryClient client = BigQueryClient.Create("<Project Name>");
        BigQueryTable table = client.GetTable("<Database>", "Students");
        string sql = $"select * FROM {table} where Marks='50'";
        BigQueryResults results = client.ExecuteQuery(sql);
        foreach (BigQueryRow row in results.GetRows())
        {
        }

我希望能够将整个结果变量读取到JSON中,或者能够将JSON从每一行中删除。

当然,我可以创建一个对表进行建模的类。在foreach循环中,我可以将每一行读取到类对象中。我可以尝试使用"牛顿软"等第三方序列化的类对象。

类似:

class Student{
  int id;  // assume these are columns in the db
  string name;
}

我的foreach现在看起来像:

    foreach (BigQueryRow row in results.GetRows())
    {
        Student s=new Student();
        s.id = Convert.ToString(row["id"]);
        s.name=  Convert.ToString(row["name"]);

        // something like  string x=x+ s.toJSON();  //using newton soft
    }

这样的方式,字符串X将对每一行的JSON生成并附加。还是有一种方法可以将每个学生添加到集合或列表中,然后从整个列表中获取JSON?

按行和字段划分的整个排行似乎对我来说很乏味,我一定有一种更简单的方式。没有看到Google Bigquery的任何支持C#直接转换为JSON。他们确实在python中有东西。

如果不是,那么json的列表会更好,但我不确定是否支持。

更新:

https://github.com/googlecloudplatform/google-cloud-dotnet/blob/master/master/apis/google.cloud.bigquery.v2/google.cloud.cloud.bigquery.v2/bigquery.v2/bigquery.cs >

看起来大查询行类具有一个类型的tablerow字段。该类使用JSON参考文献,因此,我确定它们具有JSON格式的行数据。我如何将其暴露给我?

这可能有点迟了,但是您可以使用:

var latestResult = _bigQueryClient.ExecuteQuery($"SELECT TO_JSON_STRING(t) FROM `{ProjectId}.{DatasetId}.{TableName}` as t", null

所有列将被序列化为JSON,并将其放置在每行的第一列中。然后,您可以使用Newtonsoft之类的东西轻松解析每一行。

我遇到了同一问题。我正在发布此解决方案,该解决方案尚未针对性能进行优化,但对于多种数据类型非常简单。这使您可以对任何东西(几乎)

进行挑选
public class BQ
{
    private string projectId = "YOUR_PROJECT_ID";
 
    public BQ()
    {
    }       
    public List<T> Execute<T>(string sql)
    {
        var client = BigQueryClient.Create(projectId);
        List<T> result = new List<T>();
        try
        {
            string query = sql;
            BigQueryResults results = client.ExecuteQuery(query, parameters: null);
            List<string> fields = new List<string>();
            foreach (var col in results.Schema.Fields)
            {
                fields.Add(col.Name);
            }
            Dictionary<string, object> rowoDict;
            foreach (var row in results)
            {
                rowoDict = new Dictionary<string, object>();
                foreach (var col in fields)
                {
                    rowoDict.Add(col, row[col]);
                }
                string json = Newtonsoft.Json.JsonConvert.SerializeObject(rowoDict);
                T o = Newtonsoft.Json.JsonConvert.DeserializeObject<T>(json);
                result.Add(o);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
        finally
        {
            client.Dispose();
            Console.WriteLine("Done.");
        }
        return result;
    }
}

您可以使用 newtonsoft.json 。首先由PackageManager控制台下载Nuget软件包,您可以在这里获取命令。

下载后您可以将其用作以下代码:

List<Student> list = new List<Student>();
foreach (BigQueryRow row in results.GetRows())
{
    Student s=new Student();
    s.id = Convert.ToString(row["id"]);
    s.name=  Convert.ToString(row["name"]);
    list.Add(s);
}
var jsonResult = Newtonsoft.Json.JsonConvert.SerializeObject(list);

我希望这可以帮助您。

这是施放BigQueryResultsGetQueryResultsResponseQueryResponse数据的完整解决方案,使用C#反射:

public List<T> GetBQAsModel<T>(string query) where T : class, new()
{
    var bqClient = GetBigqueryClient();
    var res = bqClient.ExecuteQuery(query, parameters: null);
    return GetModels<T>(res);
        
}
private List<T> GetModels<T>(BigQueryResults tableRows) where T : class, new()
{
    var lst = new List<T>();
    foreach (var item in tableRows)
    {
            
        var lstColumns = new T().GetType().GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).ToList();
        var newObject = new T();
        for (var i = 0; i < item.RawRow.F.Count; i++)
        {
            var name = item.Schema.Fields[i].Name;
            PropertyInfo prop = lstColumns.FirstOrDefault(a => a.Name.ToLower().Equals(name.ToLower()));
            if (prop == null)
            {
                continue;
            }
            var val = item.RawRow.F[i].V;
            prop.SetValue(newObject, Convert.ChangeType(val, prop.PropertyType), null);
        }
        lst.Add(newObject);
            
    }
    return lst;
}
private List<T> GetModels<T>(GetQueryResultsResponse getQueryResultsResponse) where T : class, new()
{
    var lst = new List<T>();
    foreach (var item in getQueryResultsResponse.Rows)
    {
        var lstColumns = new T().GetType().GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).ToList();
        var newObject = new T();
        for (var i = 0; i < item.F.Count; i++)
        {
            var name = getQueryResultsResponse.Schema.Fields[i].Name;
            PropertyInfo prop = lstColumns.FirstOrDefault(a => a.Name.ToLower().Equals(name.ToLower()));
            if (prop == null)
            {
                continue;
            }
            var val = item.F[i].V;
            prop.SetValue(newObject, Convert.ChangeType(val, prop.PropertyType), null);
        }
        lst.Add(newObject);
    }
    return lst;
}
private List<T> GetModels<T>(QueryResponse queryResponse) where T : class, new()
{
    var lst = new List<T>();
    foreach (var item in queryResponse.Rows)
    {
        var lstColumns = new T().GetType().GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).ToList();
        var newObject = new T();
        for (var i = 0; i < item.F.Count; i++)
        {
            var name = queryResponse.Schema.Fields[i].Name;
            PropertyInfo prop = lstColumns.FirstOrDefault(a => a.Name.ToLower().Equals(name.ToLower()));
            if (prop == null)
            {
                continue;
            }
            var val = item.F[i].V;
            prop.SetValue(newObject, Convert.ChangeType(val, prop.PropertyType), null);
        }
        lst.Add(newObject);
    }
    return lst;
}

我会做这样的事情:

var res = Result. Getrows. Select(x=> new student(){id=x[`ID']}).

,然后:

var js = json. Conver(res); 

这种方式更快,更清晰。

最新更新