Сериализация строки JSON для соответствия параметру сервисной функции WCF - PullRequest
6 голосов
/ 12 декабря 2011

Я сталкиваюсь с проблемой сериализации объекта в JSON для соответствия имени параметра вызова функции WCF.Проблема состоит в том, чтобы отобразить имя параметра, то есть входящая строка JSON должна иметь начальное значение, совпадающее с именем параметра, передаваемого в функцию, например

"{\"GetComplexDataResult\":{\"BoolValue\":true,\"StringValue\":\"Hello World!\"}}"

Это моя функция WCF, которую я вызываю вмой клиент, и, как вы можете видеть, имя параметра совпадает с тем, которое возвращается "GetComplexDataResult"

[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]
String SaveData(CompositeType GetComplexDataResult);

Проблема, которая возникает, когда я пытаюсь сериализовать свой объект, используя Microsoft System.Web.Script.Serialization.JavaScriptSerializer илилюбая другая библиотека (например, Json.NET)

возвращает мне только {\"BoolValue\":true,\"StringValue\":\"Hello World!\"}, даже если я передаю объект того же класса "CompositeType" (это код на стороне клиента), например

CompositeType GetComplexDataResult= new CompositeType();
GetComplexDataResult.BoolValue = true;
GetComplexDataResult.StringValue = "Hello World";

JavaScriptSerializer serializer = new JavaScriptSerializer();
string json = serializer.Serialize(patchVersion);

У меня вопрос, как мне получить эту строку JSON

"{\"GetComplexDataResult\":{\"BoolValue\":true,\"StringValue\":\"Hello World!\"}}"

вместо

{\"BoolValue\":true,\"StringValue\":\"Hello World!\"}

с помощью простой передачи моего объекта в анализатор JSON.Я могу объединить его вручную после того, как сгенерирую строку JSON, но это будет слишком много времени.Есть ли парсер, который решает эту проблему.

Ответы [ 3 ]

3 голосов
/ 12 декабря 2011

Если вы сериализуете анонимный объект, используя имя параметра в качестве имени свойства, он включит его в строку json.Попробуйте это:

string json = serializer.Serialize(new { GetComplexDataResult = patchVersion});

Кроме того, если вам все равно, включено ли имя параметра в JSON, вы можете установить BodyStyle на BodyStyle = WebMessageBodyStyle.Bare.

2 голосов
/ 12 декабря 2011

Мой вопрос: есть ли значительная причина, по которой вам нужно иметь \"GetComplexDataResult\" в начале данных json?

Я не верю, что сериализаторы json будут делать то, что вы от них хотите, изначально, вам придется справиться с этим самостоятельно.

Что мы делаем в компании, в которой я работаю, так это в том, что мы создаем нашу собственную оболочку ответов, которая делает все наши ответы одинаковым форматом для всех наших служб json. В значительной степени мы создаем стандартный контракт данных, который возвращает контракт данных для одного из свойств внешней оболочки. Вы можете сделать что-то подобное, чтобы получить искомую «вложенность».

Вот пример:

[DataContract]
    public class ServiceResult<T>
    {
        [DataMember]
        public T GetComplexDataResult{ get; set; }
    }

ОБНОВЛЕНИЕ : Изменено это, чтобы быть универсальным. хотел далее объяснить, куда я иду с моим оригинальным ответом. Снова ответ Adrift является более кратким, просто имейте в виду, если вы хотите расширить, например, добавить сообщения, вам придется сделать что-то вроде этого, или вручную сделать это самостоятельно. Мне очень нравится этот подход, потому что я знаю, что мой формат всегда будет одинаковым независимо от того, какую из наших служб WCF я называю.

1 голос
/ 12 декабря 2011

Для каждого парсера JSON, который я видел - тип объекта никогда не включается в JSON.Сериализация представляет собой экземпляр этого объекта.Было бы лучше добавить атрибут type, если вам нужно знать ссылку на тип источника объекта.{\"BoolValue\":true,\"StringValue\":\"Hello World!\",\"type\":\"GetComplexDataResult\"}.

Ваш вывод страшно напоминает мне конверт SOAP.Вам не нужна инкапсуляция - она ​​просто усложняет.JSON прост - будь проще.

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