如何将Varbinary列转换为Base64字符串以另存为Json?
在SQL数据库上,我有一个Varbinary列(Content),我在Azure Data Studio中运行了查询:如何将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反
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"}