2013-06-03 8 views
39

Ok, więc próbuję wysyłać polecenia POST przez połączenie http i za pomocą formatowania JSON, aby to zrobić. Piszę program, aby to zrobić w języku C# i zastanawiałem się, jak sformatować tablicę wartości, które będą przekazywane jako JSON do serwera.Tworzenie tablicy JSON w języku C#

Obecnie mam to:

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

co przekłada się to na JSON:

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

I chcę zrobić tablicę, zwane elementy, w których każdy element zawiera te trzy wartości . Tak więc byłaby to w istocie tablica obiektów, w której obiekt zawiera nazwę, indeks i pole opcjonalne.

Domyślam się, że będzie to coś na wzór tego:

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

która, gdyby była poprawna składnia, przełoży się to w JSON:

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

Ale widocznie Robię to źle. Pomysły? Każda pomoc jest doceniana.

+0

C# nie ma literały JSON. Musisz używać typów anonimowych. – SLaks

+0

To właśnie robię. stąd "nowy" – Nealon

+0

A jeśli chcesz zapewnić serizalizację JSON, spójrz na: http://stackoverflow.com/questions/13278459/json-serialization-in-c-sharp. – gustavodidomenico

Odpowiedz

65

Jesteś blisko. To powinno załatwić sprawę:

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

Jeśli źródłem był przeliczalny jakiegoś, możesz to zrobić:

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

doskonały. Dziękuję Ci. – Nealon

+0

@Dowiedz co, jeśli chcesz zrobić to dynamicznie. Jak w pętli for? – CodeEngine

+1

Cóż, jeśli jesteś w pętli for, będziesz musiał stworzyć prawdziwy model zamiast używać anonimowych typów. Jeśli możesz użyć LINQ (i wolałbym, jeśli to zrobisz), możesz po prostu "projektować" swoje wyniki w anonimowy model, jak w moim przykładzie. –

25

Lepiej stworzyć jakąś klasę dla każdego elementu, zamiast korzystania anonimowe obiekty. A w serializowanym obiekcie powinieneś mieć tablicę tych elementów. Np .:

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; } 
} 

Zastosowanie:

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

I w rezultacie nie będzie musiał zmienić ten stan rzeczy kilka razy, jeśli trzeba zmienić danych struktura.

p.s. Here's bardzo miłe narzędzie kompleks json s

+0

+1. Zrobiłbym to również. –

+5

Jeśli posiadasz ASP.NET i Web Tools 2012, masz również świetne [Paste JSON as classes] (http://blogs.msdn.com/b/webdev/archive/2012/12/18/paste-json-as -classes-in-asp-net-and-web-tools-2012-2-rc.aspx) feature :) – khellang

+0

@KristianHellang Nie wiedziałem o tym. Dzięki. ;) – Leri

5

Również z typów anonimowy (wolę nie to zrobić) - to tylko inne podejście.

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)); 
} 

wynik:

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

+0

Powoduje cofnięcie ukośników dla każdej wartości np. \ 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

Czy możesz wyjaśnić, w jaki sposób to jest odpowiedź na pytanie? – bummi