2010-07-23 4 views
0

Je suis en train de faire quelque chose comme ce qui suit dans Script #casting Résultats JSON dans Script #

jQuery.GetJson("./GetData/", delegate(object json) 
{ 
    //json = {"Name":"Fred"}  
    Person p = (Person)json; 
    Script.Alert(p.Name); 
}); 

Il est évident que la distribution directe ne fonctionne pas parce que l'un objet Personne côté cleint utilise en fait SET_NAME et le nom la propriété est privée. Je n'arrive pas à trouver quoi que ce soit dans le Script # pour soutenir cela, est-ce que je manque juste ou est-ce que je vais devoir le faire moi-même?

Répondre

0

La meilleure option pour personnaliser la désérialisation est un constructeur manuscrit ou une méthode d'usine. C'est assez vrai dans n'importe quel environnement - si vous êtes un type sous-jacent n'est pas biunivoque avec la sérialisation, vous aurez besoin d'être plus spécifique.

Nous avons utilisé Script # pour un grand projet, et cela a généralement été notre approche face à ces situations. Cela dit, nous essayons généralement d'écrire nos propres types en utilisant les propriétés, de sorte que la désérialisation fonctionne plus naturellement.

Est-il sûr de supposer que, pour une raison quelconque, vous n'avez pas le contrôle de la définition de la classe Person? Si ce n'est pas le cas, je vous recommande fortement de refactoriser la classe pour utiliser une propriété "Name" avec un champ "nom" privé. Non seulement cela est plus idiomatique, mais cela pourrait aussi vous éviter des problèmes.

Edit:

A écrit avec mon cerveau au large. Pardonne. J'aurais dû dire que nous essayons d'écrire des classes côté script en utilisant des champs plutôt que des propriétés. Là encore, nos besoins du serveur au client sont si différents que nous n'essayons même pas d'utiliser la même bibliothèque des deux côtés, donc nous pouvons nous en sortir.

1

Je vois que cela a déjà répondu. Vous devez jeter explicitement l'objet, si quelqu'un vient par et gratter la tête c'est comment vous le faites:

[Imported] 
    [IgnoreNamespace] 
    public class Person 
    { 
     public string fullname; 
     public string address; 

     public static implicit operator Person(Dictionary o) { return null; } 
    } 

Puis dans votre getJSON:

jQuery.GetJson("GetData", delegate(object sender) { 
    Person p = Dictionary.GetDictionary(sender); 
});