Le format de structuration de données JSON

Du XML au JSON

Question

Voici un fichier XML décrivant une personne et ses coordonnées. Transformez cette structure en écrivant son équivalent au format JSON, faites les adaptations et développements nécessaires.

1
<?xml version="1.0" encoding="UTF-8" ?>
2
<person>
3
    <firstName>John</firstName>
4
    <lastName>Smith</lastName>
5
    <age>22</age>
6
    <address>
7
        <streetAddress>21 2nd Street</streetAddress>
8
        <city>New York</city>
9
        <state postalCode="10021" name="NY"/>
10
    </address>
11
    <phoneNumber type="home">
12
        212 555-1234
13
    </phoneNumber>
14
    <phoneNumber type="fax">
15
        646 555-4567
16
    </phoneNumber>
17
</person>
Indice

En JSON il n'y a pas d'attributs comme en XML, alors que ceux-ci sont parfois plus pratiques pour exprimer une notion de type, par exemple, ou pour nommer une sous-structure sans avoir à ajouter une balise. Il faut les faire figurer autrement lorsque l'on souhaite passer au format JSON.

Solution
1
{
2
    "firstName": "John",
3
    "lastName": "Smith",
4
    "age": "25",
5
    "address": {
6
        "streetAddress": "21 2nd Street",
7
        "city": "New York",
8
        "state": {
9
            "name": "NY",
10
            "postalCode": "10021"
11
        }
12
    },
13
    "phoneNumber": [
14
        {
15
            "type": "home",
16
            "number": "212 555-1234"
17
        },
18
        {
19
            "type": "fax",
20
            "number": "646 555-4567"
21
        }
22
    ]
23
}

Question

Créer un document XSLT permettant de transformer ce document XSL en la solution précédente.

Indice

Attention à la gestion des derniers éléments et au tableau.

Indice
1
<?xml version="1.0" encoding="UTF-8"?>
2
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
4
    exclude-result-prefixes="xs"
5
    version="2.0">
6
    <xsl:output method="text" indent="yes"/>
7
    
8
    <xsl:template match="person">
9
        <xsl:text>{</xsl:text>
10
        ...
11
        <xsl:text>}</xsl:text>
12
    </xsl:template>
13
    
14
     
15
</xsl:stylesheet>
Solution
1
<?xml version="1.0" encoding="UTF-8"?>
2
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
4
    exclude-result-prefixes="xs"
5
    version="2.0">
6
    <xsl:output method="text" indent="yes"/>
7
    
8
    <xsl:template match="person">
9
        <xsl:text>{</xsl:text>
10
        <xsl:apply-templates/>
11
        <xsl:text>"phoneNumber": [</xsl:text>
12
        <xsl:for-each select="phoneNumber">
13
            <xsl:if test="position() != last()">
14
                {
15
                <xsl:text>"</xsl:text><xsl:value-of select="name(@*)"/><xsl:text>" : </xsl:text>
16
                <xsl:text>"</xsl:text><xsl:value-of select="./@*"/><xsl:text>",</xsl:text>
17
                <xsl:text>"number" : "</xsl:text><xsl:value-of select="."/><xsl:text>"</xsl:text>
18
                },
19
            </xsl:if>
20
            <xsl:if test="position() = last()">
21
                {
22
                <xsl:text>"</xsl:text><xsl:value-of select="name(@*)"/><xsl:text>" : </xsl:text>
23
                <xsl:text>"</xsl:text><xsl:value-of select="./@*"/><xsl:text>",</xsl:text>
24
                <xsl:text>"number" : "</xsl:text><xsl:value-of select="."/><xsl:text>"</xsl:text>
25
                }
26
            </xsl:if>
27
        </xsl:for-each>
28
        <xsl:text>]</xsl:text>
29
        <xsl:text>}</xsl:text>
30
    </xsl:template>
31
    
32
    <xsl:template match="*">
33
        <xsl:text>"</xsl:text><xsl:value-of select="./name()"/><xsl:text>" : </xsl:text>
34
        <xsl:if test="position() != last()">
35
            <xsl:text>"</xsl:text><xsl:value-of select="."/><xsl:text>",</xsl:text>
36
        </xsl:if>
37
        <xsl:if test="position() = last()">
38
            <xsl:text>"</xsl:text><xsl:value-of select="."/><xsl:text>"</xsl:text>
39
        </xsl:if>
40
    </xsl:template>
41
    
42
    
43
    <xsl:template match="address">
44
        <xsl:text>"</xsl:text><xsl:value-of select="./name()"/><xsl:text>" : {</xsl:text>
45
            <xsl:apply-templates select="*"/>
46
        <xsl:text>},</xsl:text>
47
    </xsl:template>
48
    
49
    <xsl:template match="state">
50
        <xsl:text>"</xsl:text><xsl:value-of select="./name()"/><xsl:text>" : </xsl:text>
51
        <xsl:text>{</xsl:text>
52
        <xsl:for-each select="@*">
53
            <xsl:text>"</xsl:text><xsl:value-of select="name()" /><xsl:text>" : </xsl:text>
54
            <xsl:if test="position() != last()"><xsl:text>"</xsl:text><xsl:value-of select="."/><xsl:text>",</xsl:text></xsl:if>
55
            <xsl:if test="position() = last()"><xsl:text>"</xsl:text><xsl:value-of select="."/><xsl:text>"</xsl:text></xsl:if>
56
        </xsl:for-each>
57
        <xsl:text>}</xsl:text>
58
    </xsl:template>   
59
    
60
    <xsl:template match="phoneNumber"/>
61
 
62
</xsl:stylesheet>
PrécédentPrécédentSuivantSuivant
AccueilAccueilImprimerImprimer Harold Carrel-Billiard, Maxime Uzan, Cécile Fecherolle, 2013-2016 (Contributions : Stéphane Crozat, les étudiants de NF29) Paternité - Partage des Conditions Initiales à l'IdentiqueRéalisé avec Scenari (nouvelle fenêtre)