2011-02-09 6 views
3

Я пытаюсь десериализовать json, возвращенный из javascript через Silverlight.Deserializing от JSON (ScriptObject) к управляемому объекту

В основном на стороне клиента, я возвращаюсь 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 
} 

ответ

1

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

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

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

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

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

Если вы возвращаете фактический объект 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.

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

0

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

SL код (я прохожу 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; 
    } 
} 
Смежные вопросы