2011-08-24 9 views
6

ho qualche codice di lavoro:Decode JSON oggetto in C# senza una preventiva conoscenza di tipo

String objstr = "{\"m_children\":[{\"m_children\":null,\"m_name\":\"child0\"},{\"m_children\":null,\"m_name\":\"child1\"}],\"m_name\":\"Root\"}"; 
byte[] byteArr = Encoding.ASCII.GetBytes(objstr); 
MemoryStream ms = new MemoryStream(byteArr); 
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Node)); 

Node obj = (Node)ser.ReadObject(ms); 

cosa mi bug è che ho di conoscere il tipo di oggetto contenuto nella stringa prima di decodificarlo. Volevo inviare un oggetto codificato in JSON su una pipe TCP e non dover inviare ulteriori informazioni sul tipo di oggetto.

+0

json può serializzare solo oggetti semplici. non puoi usare qualche altra forma di serializzazione che permetta la digitazione? – Einacio

+0

[Dinamico?] (Http://msdn.microsoft.com/en-us/library/dd264736.aspx) @einacio, hanno chiesto espressamente di "non dover inviare ulteriori informazioni sul tipo di oggetto", che, dì, xsd sarebbe. – bzlm

+0

così @Almo vuole scrivere magici su un linguaggio tipizzato statico. potrebbe inviare il tipo come dati extra in JSON, ma non so se C++ può creare oggetti usando stringhe invece di classname php-style – Einacio

risposta

1

Con .NET 4.0 è possibile utilizzare oggetti dinamici. Perché non provare questa soluzione da un'altra domanda: Deserialize JSON into C# dynamic object?

+0

Grazie, vedremo che una volta l'aggiornamento a VS2010. – Almo

+0

Penso che se non si utilizza VS2010, è necessario creare il proprio serializzatore/deserializzatore utilizzando le raccolte, ad esempio Oggetti dizionario per rappresentare i nomi e i valori dei campi JSON. –

+0

OK, grazie per i suggerimenti. :) – Almo

0

Ulteriori informazioni:

http://www.codeproject.com/KB/IP/fastJSON.aspx

Quando questa libreria codifica JSON, dà abbastanza informazioni per rileggere completamente automatico.

Questo non è adatto al mio scopo, anche se, dato che include una serie di informazioni specifiche su C# e stiamo lavorando qui.