I have a custom JSON writer that uses UTF8JsonWriter.
No problem sending over internet, writing to disk, and reading back.
But now I need some beautifying for console, so I don't want the Asian language character escaping (No \u1234 something...). I just want them to look like as in JSON visualizer of Visual Studio
So I wonder if there is something like System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping
for UTF8JsonWriter and/or JsonWriterOptions.
I'm not using NewtonSoft's JSON library.
Tried things like
byte[] bytesConverted = Encoding.Convert(Encoding.UTF8, Encoding.Unicode, bytes);
string s8 = Encoding.UTF8.GetString(utf8bytes, 0, utf8bytes.Length);
string s16 = Encoding.Unicode.GetString(utf16bytes, 0, utf16bytes.Length);
but had no luck.
Here is the custom json writer
public static void WriteNodes(Utf8JsonWriter w, IEnumerable<Node> nodes)
{
w.WriteStartObject();
w.WriteStartArray("nodes");
foreach (Node n in nodes)
{
w.WriteStartObject();
w.WriteString("id", n.Id.ToString());
w.WriteStartObject("properties");
foreach (var p in n.Properties.Keys)
{
w.WriteStartObject(p);
var pVal = n.Properties[p];
pVal.Write(w);
w.WriteEndObject();
}
w.WriteEndObject();
w.WriteEndObject();
}
w.WriteEndArray();
w.WriteEndObject();
}
And this is pipe listener
public async void pipeThreadFunc()
{
while (true)
{
using (var server = new NamedPipeServerStream(PipeName, PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous))
{
Log?.Invoke(this, "Waiting for Connection");
await server.WaitForConnectionAsync();
if (server.IsConnected) Log?.Invoke(this, "Connected");
using (var streamReader = new StreamReader(server))
{
MemoryStream ms = new MemoryStream();
byte[] buffer = new byte[0x1000];
do { ms.Write(buffer, 0, server.Read(buffer, 0, buffer.Length)); }
while (!server.IsMessageComplete);
string query = Encoding.UTF8.GetString(ms.ToArray());
var nodesFound = await LookUpDBAsync(query);
// Can we please turn off CJK escaping here?
//
var writerOptions = new JsonWriterOptions { Indented = true };
byte[] bytes;
string resJson = "";
using (var ms_write = new MemoryStream())
using (var w = new Utf8JsonWriter(ms_write, writerOptions))
{
WriteNodes(w, nodesFound); //json writer above
w.Flush();
ms_write.Close();
bytes = ms_write.ToArray();
}
byte[] bytesConverted = Encoding.Convert(Encoding.UTF8, Encoding.Unicode, bytes);
resJson = Encoding.UTF8.GetString(bytes);
// Write escaped string as intended
await server.WriteAsync(bytes, 0, bytes.Length);
/* failed attempts -->
byte[] utf8bytes = Encoding.UTF8.GetBytes(resJson);
byte[] utf16bytes = Encoding.Unicode.GetBytes(resJson);
string s8 = Encoding.UTF8.GetString(utf8bytes, 0, utf8bytes.Length);
string s16 = Encoding.Unicode.GetString(utf16bytes, 0, utf16bytes.Length);
<-- */
string ss = Encoding.Unicode.GetString(bytesConverted, 0, bytesConverted.Length);
// Hope this writes unescaped string
Log?.Invoke(this, $"[{query}] = {ss}");
}
if (server.IsConnected)
{
server.Disconnect();
Log?.Invoke(this, "Disconnected");
}
}
}
}
public event EventHandler<string> Log;