Преобразование MemoryStream в строку с JSON - PullRequest
0 голосов
/ 21 апреля 2020

Мне трудно использовать MemoryStream для управления строками.

В частности, я играю с JSON без использования встроенных методов сериализации / десериализации.

При использовании NewtonSoft JSON Writer, это достаточно просто и требует TextWriter, поэтому написание примерно так с помощью строителя строк:

        StringBuilder sb = new StringBuilder();
        StringWriter sw = new StringWriter(sb);
        using (newton.JsonWriter writer=new newton.JsonTextWriter(sw))
        {
            writer.WriteStartObject();
            writer.WritePropertyName("Name");
            writer.WriteValue("Neil");
            writer.WriteEnd();
            writer.Flush();
            System.Console.WriteLine(sb.ToString());
        }

Но когда я пытаюсь использовать новый. net Core 3.x это не берет TextWriter, но Stream или IBufferWriter. Не совсем зная, как использовать IBufferWriter, единственный способ, которым я мог заставить его преобразовать поток в строку, заключался в следующем, что выглядит довольно неуклюже в сравнении. Есть ли лучший способ, чем установка позиции, создание нового читателя и чтение до конца, как показано ниже?

Или лучший способ преобразовать поток памяти в строку или использовать IBufferWriter?

        MemoryStream ms = new MemoryStream();
        System.Text.Json.Utf8JsonWriter writer = new Utf8JsonWriter(ms);
        writer.WriteStartObject();
        writer.WritePropertyName("Name");
        writer.WriteStringValue("Neil");
        writer.WriteEndObject();
        writer.Flush();
        ms.Position = 0;
        string output = new StreamReader(ms).ReadToEnd();
        Console.WriteLine(output);

спасибо.

1 Ответ

1 голос
/ 21 апреля 2020

Вы можете просто вызвать ToArray в потоке памяти, чтобы превратить его в массив байтов UTF-8, который затем можно преобразовать в строку с Encoding.UTF8.GetString:

var ms = new MemoryStream();
Utf8JsonWriter writer = new Utf8JsonWriter(ms);
writer.WriteStartObject();
writer.WritePropertyName("Name");
writer.WriteStringValue("Neil");
writer.WriteEndObject();
writer.Flush();
ms.Close();
Console.WriteLine(System.Text.Encoding.UTF8.GetString(ms.ToArray()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...