Właśnie użyłem XmlWriter, aby utworzyć XML, aby odesłać odpowiedź HTTP. Jak utworzysz ciąg JSON. Zakładam, że użyjesz konstruktora ciągów do zbudowania ciągu JSON i sformatują twoją odpowiedź jako JSON?
using ExtensionMethods;...List<Person> people =newList<Person>{newPerson{ID =1,FirstName="Scott",LastName="Gurthie"},newPerson{ID =2,FirstName="Bill",LastName="Gates"}};string jsonString = people.ToJSON();
nasz projekt można otworzyć w VS 2008 ... więc w pewnym momencie został przekonwertowany. Czy to oznacza, że możemy teraz korzystać z .NET 3.5 w ramach naszej istniejącej bazy kodów?
PositiveGuy
366
Korzystanie z Newtonsoft.Json sprawia, że jest to naprawdę łatwiejsze:
MS wysyła teraz NewtonSoft jako standard w szablonie projektu VS MVC4
Chris F Carroll
45
Można również serializacji obiektów anonimowych razie potrzeby: string json = JsonConvert.SerializeObject(new { "PropertyA" = obj.PropertyA });.
Matt Beckman
9
@MattBeckman Dostaję „Nieprawidłowy deklarator członka typu anonimowego. Członkowie typu anonimowego muszą zostać zadeklarowani przy użyciu przypisania członka, prostej nazwy lub dostępu do członka. Nie powinno "PropertyA"być PropertyA?
Jonah
Musimy więc zaimplementować klasę i obiekty, aby zbudować prosty json! Wyobraź sobie zagnieżdżone - nie ustalone tablice - elementy. Nie rozumiem, dlaczego tyle entuzjazmu w powietrzu!
Pozwól, że zapytam, jakie są zalety korzystania z tego frameworka w porównaniu z tą metodą pomocniczą, o której wspominał CMS powyżej?
PositiveGuy
1
pozwala na dokładniejszą ziarnistość w stosunku do JSON, np. możesz określić, czy chcesz
wstawić
17
Łatwe korzystanie z bibliotek Newtonsoft.Json i Newtonsoft.Json.Linq .
//Create my objectvar my_jsondata =new{Host=@"sftp.myhost.gr",UserName="my_username",Password="my_password",SourceDir="/export/zip/mypath/",FileName="my_file.zip"};//Tranform it to Json objectstring json_data =JsonConvert.SerializeObject(my_jsondata);//Print the Json objectConsole.WriteLine(json_data);//Parse the json objectJObject json_object =JObject.Parse(json_data);//Print the parsed Json objectConsole.WriteLine((string)json_object["Host"]);Console.WriteLine((string)json_object["UserName"]);Console.WriteLine((string)json_object["Password"]);Console.WriteLine((string)json_object["SourceDir"]);Console.WriteLine((string)json_object["FileName"]);
Ten fragment kodu używa DataContractJsonSerializer z System.Runtime.Serialization.Json w .NET 3.5.
publicstaticstringToJson<T>(/* this */ T value,Encoding encoding){var serializer =newDataContractJsonSerializer(typeof(T));
using (var stream =newMemoryStream()){
using (var writer =JsonReaderWriterFactory.CreateJsonWriter(stream, encoding)){
serializer.WriteObject(writer,value);}return encoding.GetString(stream.ToArray());}}
Więc ... odkomentuj odniesienie „to”, aby faktycznie uruchomić ten fragment kodu. Jeśli wcześniej nie pracowałeś z metodami rozszerzenia, może to nie być oczywiste.
Dan Esparza
7
Zajrzyj na stronę http://www.codeplex.com/json/, aby zapoznać się z projektem json-net.aspx. Po co ponownie wymyślać koło?
zależy, może nie chcę polegać na wtyczce open source innej firmy tylko do tworzenia JSON. Wolę sam stworzyć metodę string / helper.
PositiveGuy
7
Możesz także wypróbować mój ServiceStack JsonSerializer, który jest najszybszym serializatorem .NET JSON w tej chwili. Obsługuje serializację danych, dowolnych typów POCO, interfejsów, obiektów z późnymi powiązaniami, w tym typów anonimowych itp.
Podstawowy przykład
var customer =newCustomer{Name="Joe Bloggs",Age=31};var json =JsonSerializer.SerializeToString(customer);var fromJson =JsonSerializer.DeserializeFromString<Customer>(json);
Uwaga: używaj Microsofts JavaScriptSerializer tylko wtedy, gdy wydajność nie jest dla Ciebie ważna, ponieważ musiałem pominąć ją w testach porównawczych, ponieważ jest do 40x-100x wolniejszy niż inne serializatory JSON.
Próbowałem JsonSerializer.SerializeToString z listą obiektów i właśnie zwróciło puste json: "[{}, {}]" pastebin.com/yEw57L3T Oto jak wygląda mój obiekt przed wywołaniem SerializeToString i.imgur.com/dYIE7J1.png Najlepsza głosowana odpowiedź tutaj zadziałała, zwracając to, czego się spodziewałem: pastebin.com/aAtB3Gxu
Matthew Lock
najszybszy link serializatora .NET JSON nie działa.
6
Jeśli potrzebujesz złożonego wyniku (osadzonego), stwórz własną strukturę:
próbowałem JavaScriptSerializer i nie działa dobrze z zerowymi obiektami.
Luke101
1
@ Luke101: Jak dokładnie? Mam na myśli, że używam go codziennie i nigdy nie miałem problemów, więc jestem szczerze ciekawy! (bez ironii, jestem naprawdę ciekawy, ponieważ nigdy nie napotkałem problemów)
Tamas Czinege
2
Jeśli próbujesz utworzyć usługę sieci Web do obsługi danych przez JSON na stronie internetowej, rozważ użycie zestawu narzędzi ASP.NET Ajax:
Automatycznie skonwertuje twoje obiekty obsługiwane przez usługę internetową na json i utworzy klasę proxy, której możesz użyć do połączenia się z nią.
byłoby to po prostu wywołanie pliku .ashx, który zwróciłby ciąg JSON. Po pierwsze, próbuję wymyślić, jak utworzyć ciąg .. użyć StringBuilder? Po drugie, tak, jak serializować. Zwracając XML, po prostu ustawiam typ zawartości odpowiedzi, myślę: context.Response.ContentType = "text / xml"
PositiveGuy
1
DataContractJSONSerializer zrobi wszystko dla Ciebie z tym samym łatwe jak XMLSerializer. Używanie tego w aplikacji internetowej jest banalne. Jeśli używasz WCF, możesz określić jego użycie za pomocą atrybutu. Rodzina DataContractSerializer jest również bardzo szybka.
Przekonałem się, że w ogóle nie potrzebujesz serializatora. Jeśli zwrócisz obiekt jako listę. Pozwól mi skorzystać z przykładu.
W naszym asmx otrzymujemy dane przy użyciu zmiennej, którą przekazaliśmy
// return data[WebMethod(CacheDuration=180)]publicList<latlon>GetData(int id){var data =from p in db.property
where p.id == id
selectnew latlon
{
lat = p.lat,
lon = p.lon
};return data.ToList();}publicclass latlon
{publicstring lat {get;set;}publicstring lon {get;set;}}
Następnie za pomocą jquery uzyskujemy dostęp do usługi, przekazując tę zmienną.
// get latlon
function getlatlon(propertyid){var mydata;
$.ajax({
url:"getData.asmx/GetLatLon",
type:"POST",
data:"{'id': '"+ propertyid +"'}",async:false,
contentType:"application/json;",
dataType:"json",
success: function (data, textStatus, jqXHR){//
mydata = data;},
error: function (xmlHttpRequest, textStatus, errorThrown){
console.log(xmlHttpRequest.responseText);
console.log(textStatus);
console.log(errorThrown);}});return mydata;}// call the function with your data
latlondata = getlatlon(id);
Odpowiedzi:
Możesz użyć klasy JavaScriptSerializer , sprawdź ten artykuł, aby zbudować przydatną metodę rozszerzenia.
Kod z artykułu:
Stosowanie:
źródło
Korzystanie z Newtonsoft.Json sprawia, że jest to naprawdę łatwiejsze:
Dokumentacja: Serializacja i deserializacja JSON
źródło
string json = JsonConvert.SerializeObject(new { "PropertyA" = obj.PropertyA });
."PropertyA"
byćPropertyA
?string json = JsonConvert.SerializeObject(new { PropertyA = obj.PropertyA });
nie ma podwójnych cytatów naPropertyA.
Ta biblioteka jest bardzo dobra dla JSON z C #
http://james.newtonking.com/pages/json-net.aspx
źródło
Łatwe korzystanie z bibliotek Newtonsoft.Json i Newtonsoft.Json.Linq .
źródło
Ten fragment kodu używa DataContractJsonSerializer z System.Runtime.Serialization.Json w .NET 3.5.
źródło
Zajrzyj na stronę http://www.codeplex.com/json/, aby zapoznać się z projektem json-net.aspx. Po co ponownie wymyślać koło?
źródło
Możesz także wypróbować mój ServiceStack JsonSerializer, który jest najszybszym serializatorem .NET JSON w tej chwili. Obsługuje serializację danych, dowolnych typów POCO, interfejsów, obiektów z późnymi powiązaniami, w tym typów anonimowych itp.
Podstawowy przykład
Uwaga: używaj Microsofts JavaScriptSerializer tylko wtedy, gdy wydajność nie jest dla Ciebie ważna, ponieważ musiałem pominąć ją w testach porównawczych, ponieważ jest do 40x-100x wolniejszy niż inne serializatory JSON.
źródło
Jeśli potrzebujesz złożonego wyniku (osadzonego), stwórz własną strukturę:
a następnie można uzyskać ciąg JSON z wywołaniem
Wynik będzie taki:
Mam nadzieję, że to pomoże!
źródło
Jeśli nie możesz lub nie chcesz używać dwóch wbudowanych serializatorów JSON ( JavaScriptSerializer i DataContractJsonSerializer ), możesz wypróbować bibliotekę JsonExSerializer - używam jej w wielu projektach i działa całkiem dobrze.
źródło
Jeśli próbujesz utworzyć usługę sieci Web do obsługi danych przez JSON na stronie internetowej, rozważ użycie zestawu narzędzi ASP.NET Ajax:
http://www.asp.net/learn/ajax/tutorial-05-cs.aspx
Automatycznie skonwertuje twoje obiekty obsługiwane przez usługę internetową na json i utworzy klasę proxy, której możesz użyć do połączenia się z nią.
źródło
DataContractJSONSerializer zrobi wszystko dla Ciebie z tym samym łatwe jak XMLSerializer. Używanie tego w aplikacji internetowej jest banalne. Jeśli używasz WCF, możesz określić jego użycie za pomocą atrybutu. Rodzina DataContractSerializer jest również bardzo szybka.
źródło
Przekonałem się, że w ogóle nie potrzebujesz serializatora. Jeśli zwrócisz obiekt jako listę. Pozwól mi skorzystać z przykładu.
W naszym asmx otrzymujemy dane przy użyciu zmiennej, którą przekazaliśmy
Następnie za pomocą jquery uzyskujemy dostęp do usługi, przekazując tę zmienną.
I otrzymujemy naszą odpowiedź.
źródło
Zakoduj użycie
Prosty obiekt do JSON Array EncodeJsObjectArray ()
Wynik: [[29, „mike”], [5, „dummy”]]
Ładne użycie
Pretty print Metoda rozszerzenia ciągu JSON Array PrettyPrintJson ()
Wyniki to:
źródło