2016-04-28 22 views
8

Ho una domanda su come ottenere dati da un database SQL tramite ASP.NET e quindi passare i dati a Objective-C. Attualmente sto solo usando un select SQL per ottenere i dati dal database tramite ASP.NET e ASP.NET restituisce i dati in questo modo:SQL XML o JSON per tornare a Objective-C tramite ASP.NET

<ArrayOfKeyValueOfstringPunchListCellModel84zsBx89 xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> 
<KeyValueOfstringPunchListCellModel84zsBx89> 
<Key>ORC0023</Key> 
<Value xmlns:d3p1="http://schemas.datacontract.org/2004/07/LHS.Models"> 
</Value> 
</KeyValueOfstringPunchListCellModel84zsBx89> 
</ArrayOfKeyValueOfstringPunchListCellModel84zsBx89> 

E poi in Objective-C sto mettendo i dati in un NSDictionary così:

NSDictionary *punchList = [[NSDictionary alloc]initWithDictionary:[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&myError]]; 

Tutto funziona come previsto qui.

Quello che sto facendo ora è la creazione di una stored procedure che restituisce XML e hanno ASP.NET restituisce il XML (qui tutto è completato e funzionante come previsto) L'XML è venuto fuori in questo modo:

<KeyValueOfstringPunchListCellModel84zsBx89> 
<Key>ORC0023</Key> 
<Value> 
</Value> 
</KeyValueOfstringPunchListCellModel84zsBx89> 
</ArrayOfKeyValueOfstringPunchListCellModel84zsBx89> 

Ora per te fan di Objective-C, sai che non puoi avere XML in NSDictionary a meno che tu non usi un oggetto/libreria di terze parti.

Ora la mia domanda è ho ho ripristinato la mia stored procedure per restituire JSON o questo c'è un altro modo per andare su questo?

Il mio obiettivo finale è rendere il processo il più veloce possibile e la query SQL è enorme e restituisce un sacco di righe.

+1

Non si spiega veramente quale sia il tuo problema. Un confronto di dimensioni tra XML e JSON? Hai abilitato la compressione sulle risposte HTTP? – Wain

+0

perché è necessario preparare manualmente XML o JSON? L'API ASP.Net ha modi per automatizzare il processo di restituzione della risposta nel modo in cui definiamo – techspider

risposta

2

Si dovrebbe

1) ripetere l'stored procedure e restituire i dati grezzi.

2) Asp.net gestisce la formattazione dei dati, poiché alcuni client potrebbero desiderare JSON mentre altri preferirebbero xml. quindi se si sta andando il percorso JSON, è possibile restituire risultato JSON dal MVC regolatore cioè

public JsonResult GetData() 
     { 
      var temp = new { 
       name = "hello world" 
      }; 
      return this.Json(temp) 
     } 

o creare un servizio Web utilizzando API Web.

poiché si dispone di un ampio set di risultati, si dovrebbe provare a utilizzare JSON che è meno prolisso di XML e quindi si mangia meno risorse

+0

Questa è sicuramente la strada da percorrere ... se non si tratta di una versione baseline di asp.net. – Clay

0

mi piacerebbe offrire una soluzione alternativa, ma devo andare da qualche ipotesi.

Ora la mia domanda è ho ho ripristinato la mia stored procedure per restituire JSON o questo c'è un altro modo per andare su questo?

Non c'è bisogno di restituire JSON se si può evitare quel passo in più a meno che non si esegue Microsoft SQL Server 2016, che ora supporta il "FOR JSON" clausola out of the box.

Il mio obiettivo finale è rendere il processo il più veloce possibile e la query SQL è enorme e restituisce un sacco di righe.

Qui "enorme" + "veloce" può svolgere un ruolo. In entrambi i casi, è anche possibile analizzare l'XML direttamente da Objective-C come fanno i fan dei fan di C#, ala XmlReader.

Ci sono sottili involucri naturalmente, come IGXMLReader.Ed ecco un esempio preliminare contro il tuo XML.

- (NSDictionary *)retrieveDataFromXml:(NSString *)xml { 
    NSMutableDictionary *dictionary = 
     [[NSMutableDictionary alloc] initWithCapacity:200]; 
    NSString *key; 
    for (IGXMLReader *node in [[IGXMLReader alloc] initWithXMLString:xml]) { 
    if ([node type] == IGXMLReaderNodeTypeElement && 
     [[node name] hasPrefix:@"Key"]) { 
     key = [node text]; 
    } else if ([node type] == IGXMLReaderNodeTypeElement && 
       [[node name] hasPrefix:@"Value"] && [key length]) { 
     [dictionary setObject:[node text] forKey:key]; 
     key = nil; 
    } 
    } 
    return [dictionary copy]; 
} 

Ho messo insieme un esempio in github per illustrare il concetto.