Генерация строки JSON из динамического ExpandoObject - PullRequest
2 голосов
/ 13 июня 2019

Я использую C # и пытаюсь сгенерировать строку JSON из динамического объекта.

dynamic reply = new System.Dynamic.ExpandoObject();
reply.name = "John";
reply.wins = 42;
string json = System.Web.Helpers.Json.Encode(reply);
System.Console.WriteLine(json);

(Обратите внимание, что выше требуется ссылка на сборку System.Web.Helpers.)

Я надеялся, что это выведет строку:

{"name":"John","wins":42}

Но на самом деле это выдает:

[{"Key":"name","Value":"John"},{"Key":"wins","Value":42}]

Что мне нужно изменить, чтобы получитьвыход, на который я надеялся?

Ответы [ 2 ]

4 голосов
/ 13 июня 2019

Просто скачайте пакет Newtonsoft.Json Nuget.

Это предпочтительный способ работы с json в c #. Ваш код с использованием Newtonsoft будет:

    dynamic reply = new System.Dynamic.ExpandoObject();
    reply.name = "John";
    reply.wins = 42;
    string json = Newtonsoft.Json.JsonConvert.SerializeObject(reply);
    System.Console.WriteLine(json);

EDIT:

Я просто хочу лучше объяснить, почему вы получаете такой результат, когда используете метод System.Web.Helpers.Json.Encode.

ExpandoObject - это объект, поля которого определены в время выполнения , отличное от обычного объекта, поля / свойства / методы которого определены во время компиляции. Чтобы иметь возможность определять их во время выполнения, объект expando внутренне содержит словарь, который представляет собой набор пар ключ-значение.

Я не знаю, как работает этот помощник, но, вероятно, это просто простой сериализатор, и поэтому он сериализуется в массив пар ключ-значение вместо фактического ожидаемого объекта. Библиотека Newtonsoft.Json является почти стандартом для проектов на c # и, очевидно, знает, как работает объект Expando.

2 голосов
/ 13 июня 2019

Использование инструментов Newtonsoft.Json:

using Newtonsoft.Json;
/// skip a bunch of other implementation details. 

var json = Newtonsoft.Json.JsonConvert.SerializeObject(reply);

Вот как я это делаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...