C# 使用U-SQL读取包含加密内容的json文件

C# 使用U-SQL读取包含加密内容的json文件,c#,azure-data-lake,u-sql,C#,Azure Data Lake,U Sql,我使用汇编作为json提取器,它工作正常。我输入的json文件现在只是纯json。我要做的是读取一个包含加密内容的文件 因此,在提取器中,我想使用我的C#方法对字符串进行解密,但我不知道如何使其工作,因为我没有得到任何字符串。这里是提取方法 public override IEnumerable<IRow> Extract(IUnstructuredReader input, IUpdatableRow output) { // Json.Net

我使用汇编作为json提取器,它工作正常。我输入的json文件现在只是纯json。我要做的是读取一个包含加密内容的文件

因此,在提取器中,我想使用我的C#方法对字符串进行解密,但我不知道如何使其工作,因为我没有得到任何字符串。这里是提取方法

public override IEnumerable<IRow> Extract(IUnstructuredReader input, IUpdatableRow output)
    {
        // Json.Net
        using (var reader = new JsonTextReader(new StreamReader(input.BaseStream)))
        {
            // Parse Json
            //  TODO: Json.Net fails with empty input files
            var root = JToken.ReadFrom(reader);

            // Rows
            //  All objects are represented as rows
            foreach (JObject o in SelectChildren(root, this.rowpath))
            {
                // All fields are represented as columns
                this.JObjectToRow(o, output);

                yield return output.AsReadOnly();
            }
        }
    }

谁能给我指出正确的方向吗?谢谢

整个文件是加密的还是JSON文档中的字段?在第一种情况下,您需要在提取器中解密基流。确保将提取器属性atomicFileProcessing设置为true

如果仅加密JSON文档中的文本属性,则有两个选项:

  • 使用提取器提取字段(记住,它们在SqlMap中被提取为密钥/值对),然后对需要解密的值应用C#用户定义函数

  • 在JObjectToRow函数的深层,将有一些代码生成映射条目。在那里应用解密


  • 完整文件是加密的还是JSON文档中的字段?在第一种情况下,您需要在提取器中解密基流。确保将提取器属性atomicFileProcessing设置为true

    如果仅加密JSON文档中的文本属性,则有两个选项:

  • 使用提取器提取字段(记住,它们在SqlMap中被提取为密钥/值对),然后对需要解密的值应用C#用户定义函数

  • 在JObjectToRow函数的深层,将有一些代码生成映射条目。在那里应用解密


  • 通过将提取器更改为以下内容,我成功地解密了json文件的内容

     public override IEnumerable<IRow> Extract(IUnstructuredReader input, IUpdatableRow output)
        {
            // Json.Net
            using (var reader = new StreamReader(input.BaseStream))
            {
                // Parse Json
                //  TODO: Json.Net fails with empty input files
                var text = reader.ReadToEnd();
                var decr = Encryption.Decryptor.Decrypt(text);
                var root = JToken.Parse(decr);
    
                // Rows
                //  All objects are represented as rows
                foreach (JObject o in SelectChildren(root, this.rowpath))
                {
                    // All fields are represented as columns
                    this.JObjectToRow(o, output);
    
                    yield return output.AsReadOnly();
                }
            }
        }
    
    public override IEnumerable Extract(IUnstuctureDrawer输入,IUpdatableRow输出)
    {
    //Json.Net
    使用(var reader=newstreamreader(input.BaseStream))
    {
    //解析Json
    //TODO:Json.Net因输入文件为空而失败
    var text=reader.ReadToEnd();
    var decr=Encryption.Decryptor.Decrypt(文本);
    var root=JToken.Parse(decr);
    //排
    //所有对象都表示为行
    foreach(SelectChildren中的JObject o(root,this.rowpath))
    {
    //所有字段都表示为列
    这个.jobjectorow(o,输出);
    产生返回输出。AsReadOnly();
    }
    }
    }
    

    我将JsonTextReader更改为StreamReader,以便可以将流作为字符串读取。解密后,我将其解析为一个JToken,因此其余的代码仍然像以前一样工作。

    通过将提取器更改为以下内容,我成功地解密了json文件的内容

     public override IEnumerable<IRow> Extract(IUnstructuredReader input, IUpdatableRow output)
        {
            // Json.Net
            using (var reader = new StreamReader(input.BaseStream))
            {
                // Parse Json
                //  TODO: Json.Net fails with empty input files
                var text = reader.ReadToEnd();
                var decr = Encryption.Decryptor.Decrypt(text);
                var root = JToken.Parse(decr);
    
                // Rows
                //  All objects are represented as rows
                foreach (JObject o in SelectChildren(root, this.rowpath))
                {
                    // All fields are represented as columns
                    this.JObjectToRow(o, output);
    
                    yield return output.AsReadOnly();
                }
            }
        }
    
    public override IEnumerable Extract(IUnstuctureDrawer输入,IUpdatableRow输出)
    {
    //Json.Net
    使用(var reader=newstreamreader(input.BaseStream))
    {
    //解析Json
    //TODO:Json.Net因输入文件为空而失败
    var text=reader.ReadToEnd();
    var decr=Encryption.Decryptor.Decrypt(文本);
    var root=JToken.Parse(decr);
    //排
    //所有对象都表示为行
    foreach(SelectChildren中的JObject o(root,this.rowpath))
    {
    //所有字段都表示为列
    这个.jobjectorow(o,输出);
    产生返回输出。AsReadOnly();
    }
    }
    }
    

    我将JsonTextReader更改为StreamReader,以便可以将流作为字符串读取。解密后,我将其解析为一个JToken,因此代码的其余部分仍然像以前一样工作。

    感谢您的输入。完整内容将被解密,而不仅仅是字段。是的,我正在尝试解密基本流,但到目前为止没有成功。我也不能真正调试它,这也没用。至少我还没找到方法。我可以将基流转换为一个字符串(reader.ReadAsString())并对其进行解密,但不需要;I don’我不知道如何从那里开始我发现我可以创建单元测试示例项目,所以现在尝试一下,这样我就可以看到发生了什么:)你更新了你的VS工具了吗?现在,您甚至可以对失败的顶点进行本地调试。感谢您的输入。完整内容将被解密,而不仅仅是字段。是的,我正在尝试解密基本流,但到目前为止没有成功。我也不能真正调试它,这也没用。至少我还没找到方法。我可以将基流转换为一个字符串(reader.ReadAsString())并对其进行解密,但不需要;I don’我不知道如何从那里开始我发现我可以创建单元测试示例项目,所以现在尝试一下,这样我就可以看到发生了什么:)你更新了你的VS工具了吗?现在,您甚至可以对失败的顶点进行本地调试。