2009-03-31 3 views
2

Je me demandais juste si je poussais JSON trop loin? et si quelqu'un a déjà frappé ça?Postage JSON, suis-je pousser JSON trop loin?

Je dispose d'un fichier xml:

<?xml version="1.0" encoding="UTF-8"?> 
<customermodel:Customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:customermodel="http://customermodel" xmlns:personal="http://customermodel/personal" id="1" age="1" name="Joe"> 
<bankAccounts xsi:type="customermodel:BankAccount" accountNo="10" bankName="HSBC" testBoolean="true" testDate="2006-10-23" testDateTime="2006-10-23T22:15:01+08:00" testDecimal="20.2" testTime="22:15:01+08:00"> 
    <count>0</count> 
    <bankAddressLine>HSBC</bankAddressLine> 
    <bankAddressLine>London</bankAddressLine> 
    <bankAddressLine>31 florence</bankAddressLine> 
    <bankAddressLine>Swindon</bankAddressLine> 
    </bankAccounts> 
</customermodel:Customer> 

qui contient des éléments et attributs ....

qui quand je convertir en JSON me donne:

{"customermodel:Customer":{"id":"1","name":"Joe","age":"1","xmlns:xsi":"http://www.w3.org/2001/XMLSchema-instance","bankAccounts":{"testDate":"2006-10-23","testDecimal":"20.2","count":"0","testDateTime":"2006-10-23T22:15:01+08:00","bankAddressLine":["HSBC","London","31 florence","Swindon"],"testBoolean":"true","bankName":"HSBC","accountNo":"10","xsi:type":"customermodel:BankAccount","testTime":"22:15:01+08:00"},"xmlns:personal":"http://customermodel/personal","xmlns:customermodel":"http://customermodel"}} 

Alors j'envoie ceci aussi le client .. qui couvre un objet js (ou autre) édite des valeurs (les éléments) et les renvoie ensuite au serveur.

Alors je reçois la chaîne JSON, et convertir ce en XML:

<customermodel:Customer> 
    <id>1</id> 
    <age>1</age> 
    <name>Joe</name> 
    <xmlns:xsi>http://www.w3.org/2001/XMLSchema-instance</xmlns:xsi> 
    <bankAccounts> 
     <testDate>2006-10-23</testDate> 
     <testDecimal>20.2</testDecimal> 
     <testDateTime>2006-10-23T22:15:01+08:00</testDateTime> 
     <count>0</count> 
     <bankAddressLine>HSBC</bankAddressLine> 
     <bankAddressLine>London</bankAddressLine> 
     <bankAddressLine>31 florence</bankAddressLine> 
     <bankAddressLine>Swindon</bankAddressLine> 
     <accountNo>10</accountNo> 
     <bankName>HSBC</bankName> 
     <testBoolean>true</testBoolean> 
     <xsi:type>customermodel:BankAccount</xsi:type> 
     <testTime>22:15:01+08:00</testTime> 
    </bankAccounts> 
    <xmlns:personal>http://customermodel/personal</xmlns:personal> 
    <xmlns:customermodel>http://customermodel</xmlns:customermodel> 
</customermodel:Customer> 

Et il y a le problème, est ne semble pas connaître la différence entre les éléments/attributs, donc je ne peux pas vérifier contre un XSD pour vérifier cela est maintenant valide?

Y at-il une solution à cela?

Je ne peux pas être le premier à rencontrer ce problème?

Répondre

1

JsonML fournit un mappage standard bien pensé à partir de XML < -> JSON. Si vous l'utilisez, vous bénéficierez de la facilité de manipulation que vous recherchez sur le client sans perte de fidélité dans les éléments/attributs.

1

Je n'encoderais pas les informations de schéma xml dans la chaîne json - cela semble un peu en arrière. Si vous allez leur envoyer JSON, ils ne devraient pas avoir l'impression que c'est autre chose que JSON. Le xml supplémentaire servira à confondre et à rendre votre interface "fuyante".

Vous pourriez même envisager d'utiliser XML et éviter la couche d'abstraction supplémentaire. JSON est le plus logique lorsque vous savez qu'au moins une partie utilise javascript. Si ce n'est pas le cas, cela fonctionnera aussi bien que n'importe quel autre format de transport. Mais si vous avez déjà une représentation XML, c'est un peu excessif.

D'autre part, si votre client utilise vraiment javascript, il leur sera plus facile d'utiliser les données. La seule préoccupation est le voyage de retour, et une fois qu'il est dans JSON, à qui faites-vous plus confiance pour faire la conversion correctement en xml? Vous êtes probablement mieux qualifié pour cela, puisque c'est votre schéma.

0

Pour cela fonctionne, vous devrez construire logique/données supplémentaires dans vos sérialisation/méthodes unserialize - probablement créer quelque chose comme « données » « attributs » et de tenir les différentes parties:

{"customermodel:Customer": 
{ 
    "attributes": {"xmlns:xsi":"...", "xmlns:customermodel":"..."}, 
    "data": 
    { 
    "bankAccounts": 
    { 
     "attributes": { ... } 
     "data" : 
     { 
     "count":0, 
     "bankAddressLine":"..." 
     } 
    } 
    } 
} 
+0

Je ne sais pas ce qu'il y a de mieux, et je l'ai souligné ... mais il fallait cocher des cases. Je pense que je pourrais étendre le sérialiseur à asd $ aux noms d'attributs, puis modifier le sérialiseur (retour à xml) pour l'analyser en fonction des attributs $ =. – joe90

+0

Peu importe la forme, les choses à noter sont: 1) assurez-vous que les identifiants ne sont pas utilisés dans le XML, 2) test, test, test! :) –

9

JSON ne pas de sens comme un encodage XML, non. Si vous voulez travailler avec XML et le manipuler, travaillez et manipulez XML.

JSON est pour quand vous besoin de quelque chose qui est plus léger, plus facile à analyser, et plus facile à lire et écrire. Il a une structure assez simple, ni meilleure ni pire que XML, juste différente. Il contient des listes, des associations, des chaînes et des nombres, tandis que XML contient des éléments, des attributs et des entités imbriqués. Alors que vous pourriez encoder chacun dans l'autre avec précision, vous devez vous demander pourquoi vous faites cela; Si vous voulez utiliser JSON JSON, et si vous voulez utiliser XML, utilisez XML.