Mam prostą listę kluczy / wartości w JSON przesyłaną z powrotem do ASP.NET przez POST. Przykład:
{ "key1": "value1", "key2": "value2"}
NIE PRAGNIĘCIE DESERIALIZOWAĆ W MOCNE TYPY OBIEKTÓW .NET
Po prostu potrzebuję zwykłego, starego słownika (ciąg, ciąg) lub jakiegoś równoważnego (tablica skrótu, słownik (ciąg, obiekt), old-school StringDictionary - do diabła, tablica 2-D łańcuchów działałaby dla mnie.
Mogę używać wszystkiego, co jest dostępne w programie ASP.NET 3.5, a także popularnego Json.NET (którego już używam do serializacji do klienta).
Najwyraźniej żadna z tych bibliotek JSON nie ma tej oczywistej możliwości uderzania w czoło od razu po wyjęciu z pudełka - są one całkowicie skupione na deserializacji opartej na odbiciach poprzez silne kontrakty.
Jakieś pomysły?
Ograniczenia:
- Nie chcę implementować własnego parsera JSON
- Nie można jeszcze używać programu ASP.NET 4.0
- Wolałby trzymać się z dala od starszej, przestarzałej klasy ASP.NET dla JSON
json
asp.net-ajax
asp.net-3.5
json.net
richardtallent
źródło
źródło
JavaScriptSerizlizer
jest używany w ASP.NET MVC i nie jest już przestarzały.Odpowiedzi:
Json.NET robi to ...
Więcej przykładów: serializowanie kolekcji za pomocą Json.NET
źródło
dynamic
jako typu wartości:JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(json);
[{key: "a", value: "1"}, {key: "b", value:"2"}]
, musisz zrobić coś takiego:var dict = JsonConvert.DeserializeObject<List<KeyValuePair<string, string>>>(json);
Odkryłem, że .NET ma wbudowany sposób, aby rzutować ciąg JSON na typ
Dictionary<String, Object>
viaSystem.Web.Script.Serialization.JavaScriptSerializer
w zestawie 3.5System.Web.Extensions
. Użyj metodyDeserializeObject(String)
.Natknąłem się na to, gdy robiłem posta ajax (poprzez jquery) typu zawartości „application / json” do statycznej metody strony .net i zobaczyłem, że metoda (która miała jeden parametr typu
Object
) magicznie otrzymała ten słownik.źródło
var jsSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();
po którym następujeDictionary<string, object> dict = (Dictionary<string, object>)jsSerializer.DeserializeObject(jsonString);
SomeData: ""
Dla tych, którzy szukają w Internecie i natkną się na ten post, napisałem post na blogu na temat korzystania z klasy JavaScriptSerializer.
Czytaj więcej ... http://procbits.com/2011/04/21/quick-json-serializationdeserialization-in-c/
Oto przykład:
źródło
Próbowałem nie używać żadnej zewnętrznej implementacji JSON, więc dokonałem deserializacji w następujący sposób:
źródło
System.Web.Script.Serialization
. To po prostu działa. Byłem nawet w stanie użyć „niepoprawnego” JSON jakstring json = "{'id':13, 'value': true}";
.Miałem ten sam problem, więc napisałem to sam. To rozwiązanie różni się od innych odpowiedzi, ponieważ może dokonać deserializacji na wiele poziomów.
Wystarczy wysłać ciąg JSON, aby deserializeToDictionary funkcja zwróciła obiekt nietypowy
Dictionary<string, object>
.Stary kod
Przykład: Zwróci
Dictionary<string, object>
obiekt odpowiedzi JSON na Facebooku.Test
Aktualizacja
Moja stara odpowiedź działa świetnie, jeśli w łańcuchu JSON nie ma tablicy. Ten dodatkowo deserializuje się w
List<object>
elemencie if, jeśli jest tablicą.Wystarczy wysłać ciąg JSON, aby deserializeToDictionaryOrList funkcja zwróci obiekt nietypowy
Dictionary<string, object>
lubList<object>
.źródło
is
ias
operatorów bardzo mi pomogło i uprościło mój własny kod.Jeśli zależy Ci na lekkim podejściu bez dodawania odniesień, być może ten fragment kodu, który właśnie napisałem, zadziała (chociaż nie mogę w 100% zagwarantować solidności).
[Zdaję sobie sprawę, że to narusza Ograniczenie OP nr 1, ale technicznie tego nie napisałeś, ja zrobiłem]
źródło
System.RunTime.Serialization
nie jest jedną z nich, niestety JSON.NET zależy od i dlatego też nie można go użyć. Dzięki dexy za twoją świetną pracę, odważyłem się trochę ulepszyć, aby móc deserializować tablice tablic, zobacz zaktualizowany kod w mojej odpowiedzi tutaj .Musiałem tylko przeanalizować zagnieżdżony słownik, na przykład
gdzie
JsonConvert.DeserializeObject
nie pomaga. Znalazłem następujące podejście:SelectToken
Pozwala kopać dół do żądanego pola. Możesz nawet określić ścieżkę, np."x.y.z"
Zejść dalej do obiektu JSON.źródło
System.Text.Json
Można to teraz zrobić za pomocą
System.Text.Json
wbudowanego w.net core 3.0
. Można teraz dokonać deserializacji JSON bez korzystania z bibliotek stron trzecich.Dostępne również w pakiecie nu-get System.Text.Json, jeśli używasz .Net Standard lub .Net Framework.
źródło
System.Text.Json
jest sposobem, aby przejść w tych dniach.Mark Rendle opublikował to jako komentarz , chciałem opublikować to jako odpowiedź, ponieważ jest to jedyne rozwiązanie, które do tej pory działało, aby zwrócić sukces i kody błędów JSON z odpowiedzi Google reCaptcha.
Jeszcze raz dziękuję, Mark!
źródło
Edycja: Działa, ale zaakceptowana odpowiedź przy użyciu Json.NET jest znacznie prostsza. Pozostawienie tego na wypadek, gdyby ktoś potrzebował tylko kodu BCL.
Nie jest obsługiwany przez system .NET po wyjęciu z pudełka. Rażący niedopatrzenie - nie wszyscy muszą deserializować na obiekty o nazwanych właściwościach. Skończyło się na tym, że sami:
Dzwoni z:
Przepraszamy za połączenie C # i VB.NET…
źródło
Dodałem tutaj kod przesłany przez jSnake04 i Dasun. Dodałem kod do tworzenia list obiektów z
JArray
instancji. Ma dwukierunkową rekurencję, ale ponieważ działa na stałym, skończonym modelu drzewa, nie ma ryzyka przepełnienia stosu, chyba że dane są ogromne.źródło
Do drugiej odpowiedzi dodałem sprawdzanie wartości pustych w JSON
Miałem ten sam problem, więc napisałem to sobie. To rozwiązanie różni się od innych odpowiedzi, ponieważ może dokonać deserializacji na wiele poziomów.
Wystarczy wysłać ciąg json, aby deserializeToDictionary funkcja zwróciła obiekt nietypowy
Dictionary<string, object>
.Przykład: Zwróci
Dictionary<string, object>
obiekt odpowiedzi JSON na Facebooku.Uwaga: miasto rodzinne dalej przekształca
Dictionary<string, object>
obiekt w postaci szeregowej.źródło
d.Value is JObject
. Nie musisz przechodzić refleksji, aby sprawdzić typy. Zis
operatorem nie musisz sprawdzać, czy nie ma wartości null. Zwraca false, jeśli obiekt ma wartość NULL.Wygląda na to, że wszystkie te odpowiedzi tutaj zakładają, że możesz wyciągnąć ten niewielki ciąg z większego obiektu ... dla osób, które chcą po prostu zdezrealizować duży obiekt za pomocą takiego słownika gdzieś w odwzorowaniu i które używają
System.Runtime.Serialization.Json
systemu DataContract, oto rozwiązanie:Odpowiedź na gis.stackexchange.com miała ten interesujący link . Musiałem go odzyskać za pomocą archive.org, ale oferuje całkiem idealne rozwiązanie: niestandardowe
IDataContractSurrogate
klasę, w której implementujesz dokładnie własne typy. Z łatwością mogłem go rozwinąć.Dokonałem jednak wielu zmian. Ponieważ oryginalne źródło nie jest już dostępne, opublikuję tutaj całą klasę:
Aby dodać nowe obsługiwane typy do klasy, wystarczy dodać klasę, nadać jej odpowiednie konstruktory i funkcje (spójrz na
SurrogateDictionary
przykład), upewnić się, że dziedziczyJsonSurrogateObject
i dodać mapowanie typów doKnownTypes
słownika. Dołączony SurrogateDictionary może służyć jako podstawa dla każdegoDictionary<String,T>
typów, w których T jest dowolnym typem, który dokonuje prawidłowej deserializacji.Wywołanie tego jest naprawdę proste:
Zauważ, że z jakiegoś powodu ta rzecz ma problem z używaniem ciągów znaków zawierających spacje; po prostu nie było ich na końcowej liście. Może po prostu wbrew specyfikacjom JSON, a api, do której dzwoniłem, był źle wdrożony, pamiętajcie; Nie wiem. W każdym razie rozwiązałem ten problem, zastępując je wyrażeniami regularnymi podkreśleniami w surowych danych JSON i naprawiając słownik po deserializacji.
źródło
Dictionary<String,String>
. Szczerze mówiąc nigdy nie próbowałem deserializować złożonych typów za pomocą tego systemu.Na podstawie powyższych komentarzy spróbuj
JsonConvert.DeserializeObject<Dictionary<string,dynamic>>(json)
wydaje się działać nawet w przypadku złożonych obiektów i list.
źródło
Właśnie zaimplementowałem to w RestSharp . Ten post był dla mnie pomocny.
Oprócz kodu w linku, oto mój kod. Teraz uzyskuję
Dictionary
wyniki, gdy robię coś takiego:Uważaj na rodzaj JSON, którego oczekujesz - w moim przypadku pobierałem pojedynczy obiekt o kilku właściwościach. W załączonym linku autor pobierał listę.
źródło
Moje podejście bezpośrednio deserializuje się do IDictionary, bez JObject lub ExpandObject pomiędzy. Kod wykorzystuje konwerter, który jest w zasadzie kopiowany z klasy ExpandoObjectConverter znalezionej w kodzie źródłowym JSON.NET, ale używa IDictionary zamiast ExpandoObject.
Stosowanie:
Kod:
źródło
Możesz użyć Tiny-JSON
źródło
Trochę za późno na grę, ale żadne z powyższych rozwiązań nie wskazało mi kierunku czystego i prostego .NET, bez rozwiązania json.net. Więc oto jest bardzo proste. Poniżej pełnego działającego przykładu tego, jak to się robi ze standardową serializacją .NET Json, przykład zawiera słownik zarówno w obiekcie głównym, jak i obiektach potomnych.
Złota kula to ten kot, parsuj ustawienia jako drugi parametr do serializatora:
Pełny kod poniżej:
źródło
Irytujące jest to, że jeśli chcesz użyć domyślnych segregatorów modelu, wygląda na to, że będziesz musiał użyć liczbowych wartości indeksu, takich jak formularz POST.
Zobacz następujący fragment tego artykułu http://msdn.microsoft.com/en-us/magazine/hh781022.aspx :
źródło
Sugeruję użycie
System.Runtime.Serialization.Json
tego jest częścią .NET 4.5.Następnie użyj go w następujący sposób:
źródło
Dla każdego, kto próbuje przekonwertować JSON na słownik tylko w celu odzyskania z niego pewnej wartości. istnieje prosty sposób użycia
Newtongsoft.JSON
źródło