Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将Varbinary列转换为Base64字符串以另存为Json?_Json_Sql Server_Tsql_Asp.net Core - Fatal编程技术网

如何将Varbinary列转换为Base64字符串以另存为Json?

如何将Varbinary列转换为Base64字符串以另存为Json?,json,sql-server,tsql,asp.net-core,Json,Sql Server,Tsql,Asp.net Core,在SQL数据库上,我有一个Varbinary列(Content),我在Azure Data Studio中运行了查询: SELECT Id, Name, Content FROM Files 结果是: Id Name Content 1 File1 0xFFD8FFE000104A464946000102 ... 2 File2 0xFFD8FFE000104A464946000102 ... 我将结果导出到JSON,并尝试使用Asp.NET Core JSON反

在SQL数据库上,我有一个Varbinary列(Content),我在Azure Data Studio中运行了查询:

SELECT Id, Name, Content
FROM Files
结果是:

Id   Name   Content
1    File1  0xFFD8FFE000104A464946000102 ... 
2    File2  0xFFD8FFE000104A464946000102 ... 
我将结果导出到JSON,并尝试使用Asp.NET Core JSON反序列化程序对其进行反序列化:

  Byte[] json = await System.IO.File.ReadAllBytesAsync(path);

  List<File> files = JsonSerializer.Deserialize<List<File>>(Encoding.UTF8.GetString(json));
但在反序列化过程中,我得到了一个错误:

Cannot decode JSON text that is not encoded as valid Base64 to bytes.
我尝试将SQL查询更改为:

SELECT Id, Name, CAST(CAST('' as XML).value('xs:base64Binary(sql:column("Content"))', 'VARBINARY(MAX)') AS NVARCHAR(MAX)) as [Content]
FROM Files
但我在反序列化过程中遇到了同样的错误

如何将varbinary列转换为Base64字符串以另存为JSON

更新

我尝试使用以下方法检查它是否为Base64字符串(不要仅依赖反序列化程序):

Span buffer=newspan(新字节[content.Length]);
var isBase64=Convert.TryFromBase64String(内容、缓冲区、已解析的out int);

但我总是出错…

这是一个已知的github问题

SELECT Id, Name, CAST('' as XML).value('xs:base64Binary(sql:column("Content"))', 'NVARCHAR(MAX)') as [Content]
FROM Files



declare @binary varbinary(max) = cast(N'{"message":"OK"}' as varbinary(max))
select CAST('' as XML).value('xs:base64Binary(sql:variable("@binary"))', 'NVARCHAR(MAX)') -- ewAiAG0AZQBzAHMAYQBnAGUAIgA6ACIATwBLACIAfQA=

Console.WriteLine(System.Text.Encoding.Unicode.GetString(Convert.FromBase64String("ewAiAG0AZQBzAHMAYQBnAGUAIgA6ACIATwBLACIAfQA="))); --{"message":"OK"}
有效的base64编码字符串长度始终是4的倍数(如果没有足够的输入数据,则会添加填充
=

2.1中的解码器只接受一个填充字符(Asp.net core 3.0在我测试后也只接受一个填充字符)


要解决这种情况,请确保json字符串中的
内容
应该是4的倍数。

这是已知的github问题

有效的base64编码字符串长度始终是4的倍数(如果没有足够的输入数据,则会添加填充
=

2.1中的解码器只接受一个填充字符(Asp.net core 3.0在我测试后也只接受一个填充字符)


要解决这种情况,请确保json字符串中的
Content
应该是4的倍数。

我尝试了您的代码,但得到了相同的错误。。。我在问题中添加了一些额外的C#代码,用于验证它是否是Base64字符串,以避免仅依赖Json反序列化程序异常。我猜错了,我试过你的密码,结果还是一样。。。我在问题中添加了一些额外的C#代码,用于验证它是否是Base64字符串,以避免仅依赖Json反序列化程序异常。而我是假的。
Span<byte> buffer = new Span<byte>(new byte[content.Length]);
var isBase64 = Convert.TryFromBase64String(content, buffer , out int parsed);
SELECT Id, Name, CAST('' as XML).value('xs:base64Binary(sql:column("Content"))', 'NVARCHAR(MAX)') as [Content]
FROM Files



declare @binary varbinary(max) = cast(N'{"message":"OK"}' as varbinary(max))
select CAST('' as XML).value('xs:base64Binary(sql:variable("@binary"))', 'NVARCHAR(MAX)') -- ewAiAG0AZQBzAHMAYQBnAGUAIgA6ACIATwBLACIAfQA=

Console.WriteLine(System.Text.Encoding.Unicode.GetString(Convert.FromBase64String("ewAiAG0AZQBzAHMAYQBnAGUAIgA6ACIATwBLACIAfQA="))); --{"message":"OK"}