2013-06-03 40 views
39

Ok, quindi sto provando a inviare comandi POST tramite una connessione http e utilizzando la formattazione JSON per farlo. Sto scrivendo il programma per farlo in C#, e mi chiedevo come avrei formattato un array di valori da passare come JSON al server.Creazione di un array JSON in C#

Attualmente ho questo:

new {name = "command" , index = "X", optional = "0"}

che si traduce in questo in JSON:

"name": "command", 
"index": "X", 
"optional": "0" 

E voglio fare un array, chiamati elementi, in cui ogni elemento contiene questi tre valori . Quindi sarebbe essenzialmente una matrice di oggetti, in cui l'oggetto contiene un nome, un indice e un campo facoltativo.

La mia ipotesi è che sarebbe qualcosa sulla falsariga di questo:

new {items = [(name = "command" , index = "X", optional = "0"), 
       (name = "status" , index = "X", optional = "0")]} 

Il che, se si trattasse di sintassi corretta, si tradurrebbe in questo in JSON:

"items": 
[ 
    { 
     "name": "command", 
     "index": "X", 
     "optional": "0" 
    }, 
    { 
     "name": "status", 
     "index": "X", 
     "optional": "0" 
    } 
] 

Ma, evidentemente, Sto sbagliando. Idee? Qualsiasi aiuto è apprezzato.

+0

C# non ha letterali JSON. Devi usare tipi anonimi. – SLaks

+0

Questo è quello che sto facendo. quindi, il 'new' – Nealon

+0

E se si desidera fornire la serizalizzazione JSON, dare un'occhiata: http://stackoverflow.com/questions/13278459/json-serialization-in-c-sharp. – gustavodidomenico

risposta

65

Sei vicino. Questo dovrebbe fare il trucco:

new {items = new [] { 
    new {name = "command" , index = "X", optional = "0"}, 
    new {name = "command" , index = "X", optional = "0"} 
}} 

Se la sorgente è stato un enumerabile di qualche tipo, si potrebbe desiderare di fare questo:

new {items = source.Select(item => new 
{ 
    name = item.Name, index = item.Index, options = item.Optional 
})}; 
+0

perfetto. grazie. – Nealon

+0

@Dave cosa succede se hai bisogno di farlo dinamicamente. Ti piace all'interno di un ciclo for? – CodeEngine

+1

Beh, se sei in un ciclo for, dovrai creare un modello reale invece di usare tipi anonimi. Se puoi usare LINQ (e preferirei se lo fai) allora puoi semplicemente "proiettare" i tuoi risultati in un modello anonimo come nel mio esempio. –

25

Faresti meglio a creare un po 'di classe per ogni oggetto invece di utilizzare oggetti anonimi. E nell'oggetto che stai serializzando dovresti avere una matrice di questi elementi. Es .:

public class Item 
{ 
    public string name { get; set; } 
    public string index { get; set; } 
    public string optional { get; set; } 
} 

public class RootObject 
{ 
    public List<Item> items { get; set; } 
} 

Usage:

var objectToSerialize = new RootObject(); 
objectToSerialize.items = new List<Item> 
          { 
          new Item { name = "test1", index = "index1" }, 
          new Item { name = "test2", index = "index2" } 
          }; 

E nel risultato non sarà necessario cambiare le cose più volte se è necessario modificare i dati-struttura.

p.s. Here's molto bello strumento per la complessa json s

+0

+1. Lo farei anche io. –

+5

Se hai ASP.NET e Web Tools 2012 hai anche questo fantastico [Incolla JSON come classi] (http://blogs.msdn.com/b/webdev/archive/2012/12/18/paste-json-as -classes-in-asp-net-and-web-tools-2012-2-rc.aspx) caratteristica :) – khellang

+0

@KristianHellang Non lo sapevo. Grazie. ;) – Leri

5

Inoltre, con i tipi anonimi (io preferisco non a fare questo) - questo è solo un altro approccio .

void Main() 
{ 
    var x = new 
    { 
     items = new[] 
     { 
      new 
      { 
       name = "command", index = "X", optional = "0" 
      }, 
      new 
      { 
       name = "command", index = "X", optional = "0" 
      } 
     } 
    }; 
    JavaScriptSerializer js = new JavaScriptSerializer(); //system.web.extension assembly.... 
    Console.WriteLine(js.Serialize(x)); 
} 

risultato:

{"items":[{"name":"command","index":"X","optional":"0"},{"name":"command","index":"X","optional":"0"}]}

+0

Restituisce le barre con ogni valore e.g \ command – Sami

-4
new {var_data[counter] =new [] { 
       new{ "S NO": "+ obj_Data_Row["F_ID_ITEM_MASTER"].ToString() +","PART NAME": " + obj_Data_Row["F_PART_NAME"].ToString() + ","PART ID": " + obj_Data_Row["F_PART_ID"].ToString() + ","PART CODE":" + obj_Data_Row["F_PART_CODE"].ToString() + ", "CIENT PART ID": " + obj_Data_Row["F_ID_CLIENT"].ToString() + ","TYPES":" + obj_Data_Row["F_TYPE"].ToString() + ","UOM":" + obj_Data_Row["F_UOM"].ToString() + ","SPECIFICATION":" + obj_Data_Row["F_SPECIFICATION"].ToString() + ","MODEL":" + obj_Data_Row["F_MODEL"].ToString() + ","LOCATION":" + obj_Data_Row["F_LOCATION"].ToString() + ","STD WEIGHT":" + obj_Data_Row["F_STD_WEIGHT"].ToString() + ","THICKNESS":" + obj_Data_Row["F_THICKNESS"].ToString() + ","WIDTH":" + obj_Data_Row["F_WIDTH"].ToString() + ","HEIGHT":" + obj_Data_Row["F_HEIGHT"].ToString() + ","STUFF QUALITY":" + obj_Data_Row["F_STUFF_QTY"].ToString() + ","FREIGHT":" + obj_Data_Row["F_FREIGHT"].ToString() + ","THRESHOLD FG":" + obj_Data_Row["F_THRESHOLD_FG"].ToString() + ","THRESHOLD CL STOCK":" + obj_Data_Row["F_THRESHOLD_CL_STOCK"].ToString() + ","DESCRIPTION":" + obj_Data_Row["F_DESCRIPTION"].ToString() + "} 
     } 
    }; 
+3

Puoi spiegare come questo risponde alla domanda? – bummi