Десериализация из JSON (ScriptObject) в управляемый объект - PullRequest
3 голосов
/ 09 февраля 2011

Я пытаюсь десериализовать json, возвращенный из javascript через Silverlight.

В основном на стороне клиента я возвращаю JSON, а в моем обработчике C # я получаю его через ScriptObject ...

Я попробовал метод ConvertTo в ScriptObject и все еще не смог ничего получить.

Как бы я мог преобразовать ScriptObject в объект C #, который является списком объектов?

SomeCallBack(ScriptObject result) {

    // convert to managed object

    var objects = result.ConvertTo<List<SomeObjectClass>>(); // can't get any property from it..

    // however the count is correct...
    MessageBox.Show("count: " + objects.Count); // shows correct count of items
}

Ответы [ 4 ]

1 голос
/ 05 июня 2011

http://json.codexplex.com/

У них есть версия Silverlight, звучит как Newtonsoft.Json.Linq.JObject - это то, что вам нужно.

1 голос
/ 10 февраля 2011

Silverlight не содержит API для получения ScriptObject и сериализации в строку JSON.

Silverlight поддерживает сериализацию JSON через класс System.Runtime.Serialization.Json.DataContractJsonSerializer, найденный в System.ServiceModel.Web dll.

Вам потребуется получить некоторый базовый JSON-сериализатор JSON для преобразования значения, которое вы пытаетесь передать, в ScriptObject, чтобы вы передавали строковый параметр JSON вместо ScriptObject.Я считаю, что популярным инструментом для этой работы является JQuery.

Теперь похоже, что вы ожидали набор (в формате JSON типа "[x1, x2 ,,, xn]"), где элементы x имеют тип SomeObjectClass,Вы можете использовать эту небольшую универсальную функцию для десериализации такого списка: -

    List<T> DeserializeJSON<T>(string json)
    {

        byte[] array = Encoding.UTF8.GetBytes(json);
        MemoryStream ms = new MemoryStream(array);

        DataContractJsonSerializer dcs = new DataContractJsonSerializer(typeof(List<T>));
        return (List<T>)dcs.ReadObject(ms);

    }

Вы бы сделали: -

 var objects = DeserializeJSON<SomeObjectClass>(someJSON);
0 голосов
/ 23 января 2012

У меня все работает, просто имитируя объекты JS кодом C#. Интересно, что он даже позволял использовать литералы объектов на стороне JS (см. Collection элементы, они просто литералы объектов - хороший ход - действительно, JS - это драйвер!)

SL Code (я передаю JS объект в мой SL компонент для обработки):

[ScriptableMember()]
public string GetValue(ScriptObject o)
{

  Prototype p = (Prototype)o.ConvertTo<Prototype>();
  return "A";
}

JS:

control.Content.ExternalName.GetValue({ Collection: [{ a: "A1" }, { a: "A2"}] })

C #

public class Prototype
{  
  public List<PrototypeItem> Collection
  {
    get;
    set;
  }
}

public class PrototypeItem
{
  public string a
  {
    get;
    set;
  }
}
0 голосов
/ 09 июня 2011

Если вы возвращаете фактический объект JSON, то вы можете использовать метод ScriptObject.ConvertTo для десериализации объекта JSON непосредственно в объект C #.Например, вы можете сделать:

Объект JSON

{ id: 0001,
  name: 'some_name',
  data: [0.0, 1.0, 0.9, 90.0] }

Объект C #

using System.Runtime.Serialization;  // From the System.Runtime.Serialization assembly

[DataContract]
public struct JsonObj
{
    [DataMember]
    public int id;

    [DataMember]
    public string name;

    [DataMember]
    public double[] data;
}

Обратный вызов C #

public void SomeCallback(ScriptObject rawJsonObj)
{
    // Convert the object
    JsonObj jsonObj = rawJsonObj.ConvertTo<JsonObj>();
}

Однако, если вы возвращаете строку, представляющую объект JSON, а не реальный объект JSON, тогда это не будет работать, и вам придется использовать альтернативную десериализациюметод.Подробнее см. MSDN .

Надеюсь, это поможет.

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