how Xamarin+JSON.Net




json net changelog (2)

Ho difficoltà a capire perché il parser JSON Newtonsoft deve essere specifico per dispositivo sotto Xamarin. Non riesco a trovare alcun modo per far esistere il parser in una libreria condivisa e comune. Sto usando l'app di esempio Tasky Pro. Posso ottenere che le DLL JSON.Net dello store Xamarin funzionino nei progetti Android e iOS, tuttavia ciò non ha alcun senso architettonico. Ad esempio, le cose SQLite sono tutte in una lib condivisa, come ci si aspetterebbe - come un insieme di file sorgente c #.

Idealmente mi piacerebbe solo aggiungere qualche tipo di riferimento a "Tasky.Core" ed essere in grado di serializzare / deserializzare JSON.

C'è un modo per far funzionare JSON.Net in una libreria condivisa (attraverso droid / ios / wp8)? La fonte è abbastanza grande da provare a gestire come file collegati, se è anche possibile ...

In caso contrario, esiste un modo alternativo di gestire JSON che funzionerà in questo modo?


Answer #1

Basta aggiungerlo alla Libreria condivisa tramite NuGet. In realtà, tutte le attività di richiesta / risposta devono essere eseguite in biblioteca. È necessario utilizzare JSON.Net per analizzare la risposta.


Answer #2

Dovresti essere in grado di utilizzare il pacchetto NuGet di JSon.NET per questo. L'implementazione è in realtà specifica per la piattaforma [1], ma NuGet si prenderà cura di te in modo trasparente e sceglierà quello giusto per te.

Nota che hai bisogno di Mono 3.2.6 e Xamarin.iOS 7.0.6 per questo, che ho appena colpito il canale alfa questa settimana, ho appena corretto alcuni bug critici in quest'area. È inoltre necessario aggiornare l'add-in NuGet in Xamarin Studio all'ultima versione (0.8), che contiene diverse correzioni di bug relative a PCL.

Aggiungi semplicemente il Componente aggiuntivo NuGet a Xamarin Studio se non lo hai già fatto, quindi cerca "JSon.NET", il componente aggiuntivo installerà automaticamente il pacchetto e aggiungerà i riferimenti bibliografici richiesti per te.

[1] Il pacchetto NuGet contiene diversi file .dll per diversi framework di destinazione e quindi seleziona e fa riferimento a quello migliore per il tuo progetto, quindi l'applicazione conterrà solo un'implementazione singola, ma un'app iOS potrebbe usarne una diversa da un'applicazione desktop.

Aggiornamento 14/01/14 :

I pacchetti NuGet di solito contengono diverse implementazioni - sfortunatamente, non tutti funzionano con Xamarin.iOS a causa di API come Reflection.Emit o Full DLR che non sono disponibili su iOS.

Se si esamina la packages/Newtonsoft.Json.5.0.8/lib/ directory packages/Newtonsoft.Json.5.0.8/lib/ , packages/Newtonsoft.Json.5.0.8/lib/ visualizzate diverse sottodirectory: ognuna di queste contiene un'implementazione diversa e NuGet utilizzerà quella che meglio si adatta al framework di destinazione corrente. Purtroppo, NuGet non sceglie sempre quello giusto :-(

Per Newtonsoft.Json.5.0.8, l'implementazione "portable-net45 + wp80 + win8" utilizza funzionalità DLR che non sono disponibili su iOS, il "portable-net40 + sl4 + wp7 + win8" è ok. Pertanto, se si aggiunge il pacchetto NuGet a un PCL scelto come profilo Profile136, si otterrà l'implementazione corretta.

Non esiste una GUI per scegliere un'altra implementazione, ma puoi modificare il file .csproj. Sostituire

<Reference Include="Newtonsoft.Json">
  <HintPath>..\packages\Newtonsoft.Json.5.0.8\lib\portable-net45+wp80+win8\Newtonsoft.Json.dll</HintPath>
</Reference>

con

<Reference Include="Newtonsoft.Json">
  <HintPath>..\packages\Newtonsoft.Json.5.0.8\lib\portable-net40+sl4+wp7+win8\Newtonsoft.Json.dll</HintPath>
</Reference>

e dovrebbe funzionare.

In generale, quando ricevi un messaggio di errore sui tipi mancanti dopo aver aggiunto un nuovo pacchetto NuGet, vai alla directory del pacchetto corrispondente e grep -r per quel simbolo - è probabile che ci sia un'implementazione diversa che non usa questo tipo.

Si spera che in futuro sia disponibile una soluzione più elegante, ma ciò richiede il coordinamento con il team di NuGet e gli autori dei pacchetti, quindi ci vorrà del tempo.





xamarin