parser dichiarativo per JSON e DOM

1

Sto analizzando molti JSON e DOM in PHP. Il problema è che le mie conoscenze sulla struttura di JSON / DOM sono mescolate con il codice. Ad esempio, supponiamo di avere poche fonti di nome e cognome. Ogni origine dati può avere un aspetto diverso e avere i propri trucchi, ad esempio:

  1. [
      {"firstname": "FirstName1", "lastname": "LastName1"},
      {"firstname": "FirstName2", "lastname": "LastName2"}
    ]
    
  2. {
      "firstnames": ["FirstName1", "FirstName2"],
      "lastnames": ["LastName1", "LastName2"]
    }
    
  3. {
      "firstnames":
      [
        {"firstname": "FirstName1", "id": 1},
        {"firstname": "FirstName2", "id": 2}
      ],
      "lastnames":
      [
        {"lastname": "LastName2", "id": 2},
        {"lastname": "LastName1", "id": 1}
      ]
    }
    

Quindi per ogni fonte di dati scrivo codice che trasforma il JSON nei miei oggetti. Se il JSON è molto complesso, anche il codice è molto complesso ed è impossibile vedere la struttura JSON nel mio codice. Alla ricerca di bug è molto difficile.

Voglio risolvere il problema in modo dichiarativo, qualcosa come una regex JSON dove posso dire "i nomi dei primi sono in 'nomi", i secondi sono in' secondnames ', e sono collegati da' id '".

Come posso ottenerlo? JSON ha qualche tipo di linguaggio di trasformazione dichiarativo (come XSLT / XPath per XML)? Esistono strategie o schemi che possono essere utilizzati per rendere questa trasformazione JSON → Model più dichiarativa?

    
posta Mateusz Drost 15.11.2015 - 23:14
fonte

2 risposte

1

Quindi stai provando a inventare una DSL per navigare su JSON, giusto? Qualcosa come XPath di XML.

Bene, ciò che il documento JSON rappresenta è in realtà un albero o un multidimensionale multidimensionale ... beh, mi hai preso ... array / lista (anche gli array PHP sono liste).

Quindi, il semplicissimo parser JSON DSL può apparire come questo:

  1. Converte input JSON in array / lista.
  2. Prendi DSL come "firstnames.innerfolder.0" e analizzalo nel seguente modo:
    1. Dividi da .
    2. Foreach parte del DSL tenta di immergersi nell'elemento array con il nome specificato

Quando raggiungi la fine di DSL, questo sarà l'elemento di destinazione, contenente ciò che hai trovato.

    
risposta data 20.11.2015 - 08:34
fonte
0

Senza raccomandare uno strumento specifico o una lib (dato che è considerato fuori tema), ti consiglio di usare il parser JSON di riferimento per la tua lingua e provare, se non riesci a normalizzare i tuoi input, a scrivere un codice specifico per ogni formato.

A mio modesto parere, è probabile che analizzarlo a mano e / o tentare di riutilizzare il codice in ogni caso d'uso sia peggio in termini di leggibilità, manutenibilità o persino sicurezza.

    
risposta data 20.12.2015 - 22:36
fonte

Leggi altre domande sui tag