【问题标题】:Any simple ways to hide individual JSON values based on column value?根据列值隐藏单个 JSON 值的任何简单方法?
【发布时间】:2018-03-15 23:46:37
【问题描述】:

我正在 C# 中开发一些测试方法,用于验证在对各种记录进行 UI 更改后正确更新数据库记录。

为此,我开发了一种方法,该方法返回一个 SQL 查询字符串,然后我将其序列化为 JSON 字符串。使用此字符串,我将其写入临时文件,然后将其与基线预期文件进行比较,然后验证更新是否正确。

问题是我从中提取的表非常广泛并且有很多列,其中一些每次都会因创建日期、上次更新日期或类似的值而有所不同。

问题:

给定一个像这样的简单 JSON 字符串(我的实际字符串要大得多):

[
    {
        "id": 1,
        "name": "A green door",
        "price": 12.50,
        "home": "Penn"
        "date": "April 4, 2015"
    }
]

是否有任何简单的方法可以用任何指定的值屏蔽所有“日期”值,然后导致返回看起来像:

[
    {
        "id": 1,
        "name": "A green door",
        "price": 12.50,
        "home": "Penn"
        "date": "MASKEDVALUE"
    }
]

如果需要更多信息进行说明,请告诉我。

序列化代码:

public string ReturnQueryAsJson(string statement)
{
    var dataTable = new DataTable();
    var configManager = new ConfigurationManager();
    var connectionString = configManager.AppSettings["DatabaseConnectionString"];
    string query = statement;

    SqlConnection connection = new SqlConnection(connectionString);
    SqlCommand command = new SqlCommand(query, connection);
    connection.Open();

    SqlDataAdapter dataAdapter = new SqlDataAdapter(command);

    dataAdapter.Fill(dataTable);
    connection.Close();
    dataAdapter.Dispose();

    JsonConvert.SerializeObject(dataTable);
    string JsonResult;            
    JsonResult = JsonConvert.SerializeObject(dataTable, Formatting.Indented);

    return JsonResult;
}

【问题讨论】:

  • 为什么不避免在查询本身中获取这些列?
  • 这样的声音应该在序列化为 JSON 时完成,而不是在字符串中......如果你能显示该代码,它会有所帮助。
  • @DipenShah 我想避免在查询本身中获取它们,因为我必须在每个查询中避免大量列。我希望创建一个“屏蔽”列的列表,然后我可以遍历我得到的每个 JSON 对象,它会应用屏蔽。
  • @MIkeMcCaughan 我会在上面添加。
  • 也许你可以只捕获类中想要的列,然后序列化 [JsonExtensionData] 中的其他所有内容

标签: c# json testing


【解决方案1】:

您可以使用某种转换器来为您进行转换, 例如:

   public DataTable DataTableDataTransformer(DataTable original, string[] columns, string maskedValue)
   {
        // get column indices
        int[] columnIndices = columns.Select(col => original.Columns.IndexOf(col))
                                      .Where(i => i >= 0)
                                      .ToArray();

        // clone original table structure
        var retVal = original.Clone();

        // change datatype of the columns in cloned table
        foreach (var index in columnIndices)
            retVal.Columns[index].DataType = typeof(string);

        //add data to new table
        foreach(DataRow row in original.Rows)
        {
            var values = row.ItemArray;
            foreach (var index in columnIndices)
                values[index] = maskedValue;

            retVal.Rows.Add(values);
        }

        return retVal;
    }

然后您可以使用新的数据表来序列化数据,而不是使用原始数据表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    相关资源
    最近更新 更多