Silverlight неправильно передает объект JSON? - PullRequest
3 голосов
/ 19 февраля 2010

У меня есть класс Silverlight, помеченный ScriptableType & ScriptableMember, и я ожидаю, что смогу передать объект из Silverlight в javascript. Когда я вызываю JSON.stringify (в javascript), я ожидаю получить JSON-представление объекта, но все, что я получаю, это {}

Класс определяется как:

[ScriptableType()]
public class MyEvent
{
    [ScriptableMember(ScriptAlias = "eventContent")]
    public int EventContent { get; set; }
}

Я передаю объект из Silverlight так:

  var jsonObject = new MyEvent { EventContent = 1 };
  HtmlPage.Window.Invoke("publishValue", topic, jsonObject);

И в javascript я делаю следующее:

 alert(topic);
 alert(jsonObject);
 alert(JSON.stringify(jsonObject));

Когда я использую отладчик, я вижу только jsonObject типа Object, но вызов alert(jsonObject) возвращает правильный тип, и если я получаю доступ к свойству jsonObject.eventContent, я получаю верное значение, но оно неправильно сериализовать с JSON.stringify.

Кто-нибудь скажет, что я делаю не так?

Я не хочу сериализовать объект в Silverlight перед отправкой в ​​javascript.

Приветствия

AWC

Ответы [ 2 ]

2 голосов
/ 19 февраля 2010

Мне удалось решить проблему!

Вместо объявления объекта, подобного этому, для перехода из Silverlight в javascript:

[ScriptableType()] 
public class MyEvent 
{ 
    [ScriptableMember(ScriptAlias = "eventContent")] 
    public int EventContent { get; set; } 
} 

Я использую пространство имен System.Json и создаюa JsonObject вот так:

  var ob = new JsonObject
  {
       {"eventContent", 1}
  };

Ознакомьтесь с документацией System.Json.JsonObject для получения дополнительной информации.

Приветствия

AWC

2 голосов
/ 19 февраля 2010

JSON.stringify перечисляет перечисляемые свойства объекта, используя for...in. Если свойства не перечисляются, они не будут включены в результирующую строку.

Объект Silverlight - это внешний объект, а не нативный объект javascript. Как и ActiveXObject, свойства не доступны для обнаружения / перечисления. Я не уверен, есть ли способ обойти это. На нескольких страницах я обнаружил подсказку о реализации IEnumerable, чтобы иметь возможность итерации с использованием foreach на родном языке, но я не уверен, что это перенесет на JavaScript.

Я бы не стал полагать, что это возможно, но вы никогда не знаете. Если вам требуется, чтобы объект был перечисляемым, единственным способом может быть его сериализация с использованием System.Json и вызов eval в документе для его десериализации в JavaScript.

...