Il modo migliore per consumare xml / json molto dinamico / incoerente

6

Non so se chiamare i dati dinamici o incoerenti. Ma ho bisogno di creare pagine di profilo per persone generate da xml o json. La sfida è nei dati che viene restituito. I dati sono dati bibliografici su una persona e le API che la stanno restituendo sono vecchie, 11 anni. Hanno bisogno di essere rivisti.

i dati possono apparire in questo modo

    <person>
         <personalinfo>
              //Always the same......
         </personalinfo>
         <categories>
             <publications>
                 <item> //<---The issues lie inside here.
                      <authors>
                      </authors>
                      <publications>
                      </publications>
                 </item>
             </publications>
         </categories>
    </person>

Il problema si trova con le categorie e le informazioni sugli articoli. Una nuova categoria può essere aggiunta in qualsiasi momento e può essere chiamata qualsiasi cosa. Inoltre un oggetto può avere qualsiasi campo e quei campi possono avere qualsiasi nome e possono essere aggiunti in qualsiasi momento. In sostanza, non so cosa sto tornando. Inoltre, non viene restituito alcun token che fornisca suggerimenti sulla visualizzazione delle informazioni, né esistono requisiti di formato per i dati immessi nel feed che queste API restituiscono.

So che queste API devono essere aggiornate, ma al momento non è sul tavolo. Ho appena ricevuto una scadenza anticipata di 2 settimane e devo fare in modo che le pagine del profilo vengano fatte molto presto.

Esistono buoni strumenti in grado di gestire questo caos di informazioni? Qualcuno ha qualche suggerimento per fare questo rapidamente. Questo sarà un progetto iterativo che immagino, quindi qualsiasi cosa io usi è molto probabilmente una soluzione provvisoria. I dati restituiti possono essere json, ma mantiene la stessa struttura.

Il sito per cui sto creando queste pagine è un sito .net MVC. Sto usando il rasoio per tutto il resto, ma penso che per questa particolare pagina potrebbe esserci un approccio migliore.

La preoccupazione che ho non è nell'analisi dei dati. So che puoi usare oggetti dinamici con molte librerie. La preoccupazione è la formattazione dei dati una volta che ce l'ho. Non ci sono buoni identificatori o token da usare per passare attraverso i dati che lo formattano. Con questi oggetti dinamici c'è un buon modo per formattarli prima di passare il modello a una vista, o sto andando a dover scrivere un foglio xsl enorme per la gestione di tutti i casi possibili. Ci sono oltre 2000 campi diversi che gli articoli possono avere e altri potrebbero essere aggiunti, quindi non voglio farlo in questo modo.

La formattazione è un problema perché vogliono che gli autori vengano formattati in modo diverso in base alla categoria APA vs MLA, così come i formati di data e i formati di telefono / posta differiscono in base alla categoria. Il problema deriva dalle API che non posso correggere ora, non il mio progetto né mi stanno ascoltando. Quando è stata impostata la struttura dati per il back-end delle API, volevano consentire qualsiasi dato valido, ma non hanno impostato e strutturato le linee guida per la formattazione o la creazione di nuovi campi.

Quindi la pubblicazione potrebbe avere autori mentre le poesie potrebbero avere autori e articoli che potrebbero avere AUTORI. Data in una categoria il mio essere data o data di inizio o di fine o di compleanno. Mi rendo conto che non c'è una soluzione molto elegante a questo senza aver risolto la causa principale sperando che qualcuno avesse qualche consiglio per una soluzione interim facile e veloce fino a che le API non fossero affrontate correttamente. Inoltre, desiderano che riordini i campi in alcuni punti non basati sulla categoria ma basati su campi adiacenti.

    
posta PieMaker 14.10.2016 - 16:42
fonte

3 risposte

1

Dovrai scrivere un sacco di formattatori personalizzati. Ad esempio, ha alcune soluzioni per la formattazione dei numeri di telefono:

link

Come puoi vedere, molte varianti su un tema.

Potresti provare un approccio di fabbrica in cui si passa un tipo e una categoria e si restituisce un formattatore. Tutti i formattatori ereditano da un'interfaccia come IFormat. Alcuni esempi:

var formatter = FormatFactory.Create(FormatType.Telephone, "CategoryX");
var formattedString = formatter.Format(phoneNumberFromJsonString);

var formatter = FormatFactory.Create(FormatType.Author, "APA");
var formattedString = formatter.Format(AuthorFromJsonString);

Almeno sarai in grado di mantenere la logica del formato focalizzata invece di avere un singolo formattatore che cerchi di gestire tutti gli scenari.

    
risposta data 14.10.2016 - 22:56
fonte
2

Excusme in anticipo per ridigitare la risposta. Come ho sottolineato @WinstonEwert, ho ignorato il problema principale della domanda.

Riassumendo i commenti:

  • Il modello dati (EAV) non è stato normalizzato.
  • I formati dei dati non sono stati applicati al modello dati.
  • Di conseguenza, anche XML / JSON non sono normalizzati. Quindi, i dati rimangono non formattati dopo la serializzazione.

È una sequenza di problemi che non possono essere risolti alla fine della catena perché ci troveremmo di fronte a tutti.

Le soluzioni esposte qui: formattatori, XSL, espressioni regolari, ecc . Sembra soluzioni palliative. Potrebbero resistere per un po ', ma alla fine diventeranno insufficienti.

Il vero problema è nel modello di dati. Come sviluppatore, hai fatto ciò che ci si aspetta dagli sviluppatori. Per notificare il problema e i rischi. Ora non è nelle tue mani.

Detto questo, se non ci sono risorse (o volontà) per affrontare la debolezza del sistema, suggerirei prima una gestione delle aspettative .

Con risorse illimitate (tempo e denaro) tutto è possibile. Ma dubito che la tua compagnia ne abbia molti di loro. Quindi dovranno essere flessibili a un certo punto.

Misurare i costi degli approcci esposti, spiegare come il debito tecnico stia progressivamente portando l'azienda a un lavoro senza fine (a causa di nuovi elementi che possono essere aggiunti al sistema) senza alcun ROI nel prossimo futuro. Il sistema attuale sembra inefficiente e quasi impossibile da automatizzare o programmare l'attività in modo che la manutenzione diventi accessibile.

Una volta che tutti sono stati avvisati dei rischi e concordati, puoi iniziare a codificare.

    
risposta data 14.10.2016 - 21:40
fonte
1

Sembra che non puoi fare affidamento sulla struttura. Invece dovrai fare affidamento sui valori. Ti suggerisco di scrivere qualcosa di simile a un processore da riga di comando che personalizza il suo comportamento su ciascuna delle parole chiave.

Passi:

  1. Acquisisci l'inventario di tutte le parole chiave dell'elemento nel database. Forse potresti scrivere un semplice programma per scorrere i dati durante l'acquisizione dei log di Fiddler. Getta i log in un word processor e prendi un conteggio delle parole.

  2. Identifica tutte le parole che richiedono una gestione speciale, si spera che non ce ne siano troppe.

  3. Nel tuo programma, assembla un Dictionary<String,Func<string, string>> , con una voce per parola chiave speciale. La chiave nel dizionario è la parola chiave: il valore è una funzione anonima che accetta una stringa e restituisce una stringa.

  4. Popolare il dizionario con funzioni in grado di eseguire la gestione speciale per parola chiave.

  5. Per formattare una pagina, recupera l'XML e itera attraverso i suoi elementi usando XPath o Linq-Xml. Per ogni elemento, cerca la funzione anonima nel dizionario e chiamala, passando il contenuto del nodo XML.

  6. Recupera il risultato della funzione anonima e inseriscilo nella pagina.

risposta data 12.02.2017 - 05:00
fonte

Leggi altre domande sui tag