2
votes

Mapper les dépendances dans la structure JSON

Je suis en train de créer un outil Web qui permet à l'utilisateur de générer un paquet d'options sous la forme d'une chaîne. Pour sélectionner les options qu'il souhaite, il utilise un formulaire avec différentes entrées (radio, case à cocher) qui est généré à partir d'un dictionary.json qui contient actuellement toutes les options disponibles et leurs codes dans le format suivant (sujet à changement ):

[

    {
        "id": 0001,
        "title":"foo",
        "type":"radio",
        "options":[
            {
                "bar":"",
                "foo":"489",
                "foobar":"489+490"
            }
        ]
    },
    {
        "id": 0002,
        "title":"something",
        "type":"check",
        "options":[
            {
                "everything":"M016",
                "evenmore":"M139"
            }
        ]
    },

    [...]

Comme vous pouvez le voir, c'est essentiellement une petite base de données. Le problème est que les options dépendent les unes des autres, donc si foo est foobar , cela pourrait déterminer que quelque chose est certainement encore plus code > et ne peut PAS être changé en tout . Comment mapper ces dépendances dans dictionary.json afin que le formulaire généré puisse griser de manière fiable les options déterminées par d'autres choix?

Le La structure doit être flexible pour que de nouvelles dépendances puissent être insérées et généreraient le nouveau formulaire de manière fiable ou valideraient les sorties existantes par rapport à elles. Il pourrait également y avoir des options qui dépendent de plusieurs autres options. Je ne peux pas penser à un moyen intelligent de sauvegarder ces dépendances et je me demande si JSON est le bon format pour aller avec ici.

Tous les conseils ou idées sont les bienvenus. Merci!


3 Réponses :


2
votes

Vous pouvez essayer de sauvegarder chaque option comme un objet qui stocke toutes les options qui seront exclues si cette option est sélectionnée. Ainsi, votre JSON pourrait ressembler à ce qui suit:

"isExcludedBy": [
    "id": 0001,
    "options": [
        "foobar"
    ]
]

Chaque fois qu’une option est sélectionnée, vous devrez vérifier sa liste d’exclusions et activer toutes ces options pour les champs spécifiques.
Pour améliorer la convivialité, vous pouvez vérifier qu'il ne reste qu'une seule option pour un champ, sélectionnez cette option, puis désactivez tout le champ.

MODIFIER: De plus, vous pouvez enregistrer un champ isExcludedBy dans chacune des options.
L'option tout de id 0002 ressemblerait alors à ceci:

[
    {
        "id": 0001,
        "title":"foo",
        "type":"radio",
        "options":[
            {
                "bar":"",
                "excludes": []
            },
            {
                "foo":"489",
                "excludes": []
            },
            {
                "foobar":"489+490",
                "excludes": [
                    {
                        "id": 0002,
                        "options": [
                            "everything"
                        ],
                    },
                    {
                        "id": 0003,
                        "options": [
                            "apple",
                            "cherry"
                        ],
                    },
                ]
            }
        ]
    },
    {
        "id": 0002,
        "title":"something",
        "type":"check",
        "options":[
            {
                "everything":"M016",
                "excludes": []
            },
            {
                "evenmore":"M139",
                "excludes": []
            }
        ]
    },

    [...]

Ce serait un peu redondant, mais en fonction sur ce que vous voulez que votre interface utilisateur affiche, cela pourrait vous faire gagner du temps informatique.


0 commentaires

1
votes

Une solution simple possible (qui répond à votre question):

[["0001", "foobar"], [["0002", "evenmore"], ["0003", "namaste"]]]

dépendances ici se composent de paires de [ chemin vers l'option dans les options qui implique une autre option , chemin vers l'option implicite ]. Vous pouvez créer une structure de données Map directement à partir de cela (les options implicites sont des clés, les implicites sont des valeurs).

Ceci suppose qu'une option ne peut impliquer qu'une seule autre option ( mais cela permet toujours des options qui dépendent de plusieurs autres options ).

Vous pouvez bien sûr facilement étendre cela comme ceci:

// dictionary.json
{
    "options": [
        {
            "id": 0001,
            "title":"foo",
            "type":"radio",
            "options":[
                {
                    "bar":"",
                    "foo":"489",
                    "foobar":"489+490"
                }
            ]
        }
        // etc.; same as before
    ],
    // this is it:
    "dependencies": [
        [["0001", "foobar"], ["0002", "evenmore"]],
    ]
}

Cela signifierait que "0001" / "foobar" implique à la fois "0002" / "evenmore" et "0003" / "namaste" code>. Mais peut-être YAGNI. :)


0 commentaires

1
votes

Une façon d'aborder cela est de modéliser le domaine que vous exprimez réellement et de générer le formulaire en fonction de cela. Par exemple, nous savons que les appartements ont des numéros de rue et des numéros d'appartement, alors que les péniches n'ont même pas de rue.

{
   "dwelling": {
       "type": "apartment",
       "street": "Beech St.",
       "street_number": 123,
       "apartment_number": 207,
   }
}

ou

{
    "dwelling": {
        "type": "houseboat",
        "latitude": null,
        "longitude": null,
    }
}

En modélisant le domaine plutôt que le formulaire, vous pouvez écrire des règles qui s'appliquent au-delà du formulaire, et vous n'aurez pas à développer un mini-langage pour exprimer les dépendances de formulaire.


2 commentaires

Comment aborderiez-vous les dépendances avec cette approche?


@ omel09 vous n'avez pas besoin d'exprimer les dépendances avec cette approche. Vous auriez une routine pour le rendu des péniches et une autre pour le rendu des appartements. Le rendu de la péniche n'inclurait pas le numéro de rue et le rendu de l'appartement n'inclurait pas la longitude.