2015-09-15 2 views
0

У меня есть клиент, который отправляет SomeComplexObject в webservice.Deserialize сложный объект JSON, имеющий DynamicJsonArray для динамического

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

Я использую System.Web.Helpers.Json.Encode(), Decode() методы , и у меня есть проблема, когда SomeComplexObject содержит коллекцию. Он десериализуется в DynamicJsonArray, но он как-то недоступен для потребителя данных.

Это модели.

public class Aaa 
{ 
    public Bbb B { get; set; } 
    public List<Ccc> Cccs { get; set; } 
} 

public class Bbb 
{ 
    public long Key { get; set; } 
    public string Name { get; set; } 
    public DateTime DateOfBirth { get; set; } 
} 

public class Ccc 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

Будем говорить, что у меня есть myAaa объект типа Aaa со свойством типа Bbb и список из 42 Ccc объектов.

Сейчас:

var MyAaaSerialized = System.Web.Helpers.Json.Encode(MyAaa); 

Тогда я пошлю его, а затем:

var MyAaaDeserialized = System.Web.Helpers.Json.Decode(MyAaaSerialized); 

И, наконец: Это код потребителя. Email и emailService - Postal классы.

dynamic email = new Email(template); 
email.Data = MyAaaDeserialized; 
email.User = user; 
this.emailService.Send(email); 

Я могу видеть в отправленном письме, что свойства объекта B доступны. Однако свойств членов списка Cccs нет.

Конечно, с email.Data = MyAaa; все работает нормально.

Есть ли мертвый простой способ сериализации/десериализации сложного объекта, который содержит коллекцию?

Спасибо заранее,

+0

Если вы разместили образец JSON и свойство Data, с которым нам было бы больше играть. –

+0

Вы правы. Благодарю. – leszy77

ответ

0

Хорошо, я был неправ. System.Web.Helpers.Json.Encode() и Decode() работают правильно. Я расскажу вам, что произошло:

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

Теперь я хочу, чтобы некоторый веб-сервис отправлял электронные письма, поэтому мне нужно передать на него сериализованные данные. Я отправил тестовое электронное письмо, и я видел, что значения некоторых полей отсутствуют в сообщении электронной почты, но вместо этого есть «DynamicJsonObject». Поэтому я предположил (ошибочно), что структура десериализованного объекта как-то повреждена.

Но правда разные:

Недостающие данные сложного типа, скажем

public class Money 
{ 
    public double Amount {get; set;} 
    public string Currency {get; set;} 

    public override ToString() 
    {...} 
} 

Так что, когда я спросил в шаблон электронной Razor для:

@item.Prices.SalePriceGross локально,

это как-то должно было использовать метод ToString(). И, конечно, в сериализованном/десериализованном объекте нет знаний о методе ToString().

Мне нужно будет открыть свойство со строкой, которую я хочу отобразить или (лучше) получить Amount и Currency и обработать их в шаблоне электронной почты Razor.

Благодарим за помощь.

0

Если бы я не понял ваш вопрос, это может быть решена с помощью перегрузки Decode, которая использует дженерики, как показано ниже. Просто указав тип (Ааа в данном случае) работал для меня в коде ниже и распечатаны все КТС свойства правильно:

var myAaa = new Aaa() 
{ 
    B = new Bbb() { Name = "someone", DateOfBirth = DateTime.Today.AddYears(-20) }, 
    Cccs = Enumerable.Repeat<Ccc>(new Ccc() { Age = 20, Name = "someone else" }, 42).ToList() 
}; 

var MyAaaSerialized = System.Web.Helpers.Json.Encode(myAaa); 
var MyAaaDeserialized = System.Web.Helpers.Json.Decode<Aaa>(MyAaaSerialized); 
dynamic data = MyAaaDeserialized; 
foreach (Ccc newCccs in data.Cccs) 
{ 
    Console.WriteLine($"{newCccs.Name}\t{newCccs.Age}"); 
} 
+0

Спасибо, но, как я писал: «Я хочу, чтобы веб-служба не знала структуру данных, поэтому хотите, чтобы данные десериализовались в динамике, которая передается затем методу, который знает, как с этим бороться». Я хочу, чтобы любой динамический контент отправлялся в почтовую службу, которая знает (имея правильный шаблон Razor), как справиться с этим. I webservice не должен знать о типах Aaa и всех других типах, которые я, вероятно, хочу использовать. – leszy77

+0

Извините, я пропустил этот бит. Не могли бы вы также опубликовать класс электронной почты. Я обновлю свой ответ или удалю его, если он не работает –

+0

Я думаю, что в вашем примере служба электронной почты ничего не знает об Aaa. Потребитель знает об этом и присваивает его динамическому объекту. Вот почему я попросил класс электронной почты, чтобы убедиться, что внутри этого класса –