This porblem already surfaced many times:
Examples:
UTF-8 Encoding a string with double Quotes in C#
Invalid JSON after calling Encoding.UTF8.GetString()
I am trying to get the JSON representation of bytes and calling the following seems to be the right solution:
Encoding.UTF8.GetString(bytes)
This results in the following:
bytes = []
string = "[]"
bytes = {"a": 1}
string = "{\"a\": 1}"
Is there a way to stop this behaviour without using a JSON library?
The complete workflow:
Data on S3:
> awsc s3 cp s3://depoxy-dev/table-size-stats/current.json - | jq
[
{
"DatabaseName": "default",
"Tables": [],
"DatabaseSize": 0
},
{
"DatabaseName": "dwh",
"Tables": [],
"DatabaseSize": 0
},
{
"DatabaseName": "site_traffic",
"Tables": [
{
"TableName": "dev_l1x_be",
"FileCount": 47,
"TableSize": 41019220
}
],
"DatabaseSize": 41019220
},
{
"DatabaseName": "test_database",
"Tables": [],
"DatabaseSize": 0
}
]
I read it from S3 as bytes.
let readAllBytes (stream: Stream) : byte array =
use s = stream
use ms = new MemoryStream()
s.CopyTo(ms)
ms.ToArray()
This is what I try to convert to string.
Encoding.UTF8.GetString(bytes)
Results (without JQ):
"[{\u0022DatabaseName\u0022: \u0022default\u0022, \u0022Tables\u0022: [], \u0022DatabaseSize\u0022: 0}, {\u0022DatabaseName\u0022: \u0022dwh\u0022, \u0022Tables\u0022: [], \u0022DatabaseSize\u0022: 0}, {\u0022DatabaseName\u0022: \u0022site_traffic\u0022, \u0022Tables\u0022: [{\u0022TableName\u0022: \u0022dev_l1x_be\u0022, \u0022FileCount\u0022: 47, \u0022TableSize\u0022: 41019220}], \u0022DatabaseSize\u0022: 41019220}, {\u0022DatabaseName\u0022: \u0022test_database\u0022, \u0022Tables\u0022: [], \u0022DatabaseSize\u0022: 0}]"
With JQ:
"[{\"DatabaseName\": \"default\", \"Tables\": [], \"DatabaseSize\": 0}, {\"DatabaseName\": \"dwh\", \"Tables\": [], \"DatabaseSize\": 0}, {\"DatabaseName\": \"site_traffic\", \"Tables\": [{\"TableName\": \"dev_l1x_be\", \"FileCount\": 47, \"TableSize\": 41019220}], \"DatabaseSize\": 41019220}, {\"DatabaseName\": \"test_database\", \"Tables\": [], \"DatabaseSize\": 0}]"
The solution was to return the http answer as raw string and not as json.