Czy istnieje sposób na deserializację treści JSON na typ dynamiczny C # 4? Byłoby miło pominąć tworzenie grupy zajęć w celu korzystania z DataContractJsonSerializer.
Jeśli chcesz czegoś „dynamicznego”, dlaczego nie użyć po prostu akcesoriów typu get, które są dostarczane z większością dekoderów JSON, które nie przechodzą na zwykły obiekt? (np. czy naprawdę istnieje potrzeba „dynamicznego” tworzenia obiektów?) json.org zawiera kilka linków do implementacji C # JSON.
Pracuję nad projektem, który stara się ograniczyć zależności zewnętrzne do minimum. Więc jeśli to możliwe, coś z seryjnymi serializatorami .net i typami, które byłyby preferowane. Oczywiście jeśli nie jest to możliwe, wchodzę na stronę json.org. Dzięki!
jswanson
42
Jestem naprawdę zaskoczony, że zespół C # dodał „dynamiczny”, ale w CLR nie ma możliwości przekonwertowania obiektu JSON na dynamiczną instancję klasy CLR.
Frank Schwieterman,
2
Niestety zaakceptowana odpowiedź nie działa w .NET 4 RTM. Wysłałem odpowiedź, która pomogła mi zacząć z tym, co może być przydatne dla innych.
Drew Noakes
(Chociaż wydaje się, że Newtonsoft JSON.NET jest dość blisko. Nie ma jednak żadnych naprawdę dobrych przykładów.)
Hot Licks
Odpowiedzi:
659
Jeśli chcesz być zależny od System.Web.Helperszestawu, możesz użyć Jsonklasy:
dynamic data =Json.Decode(json);
Jest dołączony do frameworka MVC jako dodatkowe pobranie do frameworku .NET 4. Pamiętaj, aby dać Vladowi głos, jeśli to pomoże! Jeśli jednak nie możesz założyć, że środowisko klienta zawiera tę bibliotekę DLL, czytaj dalej.
Sugerowane jest tutaj alternatywne podejście do deserializacji . Lekko zmodyfikowałem kod, aby naprawić błąd i pasował do mojego stylu kodowania. Wszystko czego potrzebujesz to ten kod i odniesienie do System.Web.Extensionstwojego projektu:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Dynamic;
using System.Linq;
using System.Text;
using System.Web.Script.Serialization;publicsealedclassDynamicJsonConverter:JavaScriptConverter{publicoverrideobjectDeserialize(IDictionary<string,object> dictionary,Type type,JavaScriptSerializer serializer){if(dictionary ==null)thrownewArgumentNullException("dictionary");return type ==typeof(object)?newDynamicJsonObject(dictionary):null;}publicoverrideIDictionary<string,object>Serialize(object obj,JavaScriptSerializer serializer){thrownewNotImplementedException();}publicoverrideIEnumerable<Type>SupportedTypes{get{returnnewReadOnlyCollection<Type>(newList<Type>(new[]{typeof(object)}));}}#region Nested type: DynamicJsonObjectprivatesealedclassDynamicJsonObject:DynamicObject{privatereadonlyIDictionary<string,object> _dictionary;publicDynamicJsonObject(IDictionary<string,object> dictionary){if(dictionary ==null)thrownewArgumentNullException("dictionary");
_dictionary = dictionary;}publicoverridestringToString(){var sb =newStringBuilder("{");ToString(sb);return sb.ToString();}privatevoidToString(StringBuilder sb){var firstInDictionary =true;foreach(var pair in _dictionary){if(!firstInDictionary)
sb.Append(",");
firstInDictionary =false;varvalue= pair.Value;var name = pair.Key;if(valueisstring){
sb.AppendFormat("{0}:\"{1}\"", name,value);}elseif(valueisIDictionary<string,object>){newDynamicJsonObject((IDictionary<string,object>)value).ToString(sb);}elseif(valueisArrayList){
sb.Append(name +":[");var firstInArray =true;foreach(var arrayValue in(ArrayList)value){if(!firstInArray)
sb.Append(",");
firstInArray =false;if(arrayValue isIDictionary<string,object>)newDynamicJsonObject((IDictionary<string,object>)arrayValue).ToString(sb);elseif(arrayValue isstring)
sb.AppendFormat("\"{0}\"", arrayValue);else
sb.AppendFormat("{0}", arrayValue);}
sb.Append("]");}else{
sb.AppendFormat("{0}:{1}", name,value);}}
sb.Append("}");}publicoverrideboolTryGetMember(GetMemberBinder binder,outobject result){if(!_dictionary.TryGetValue(binder.Name,out result)){// return null to avoid exception. caller can check for null this way...
result =null;returntrue;}
result =WrapResultObject(result);returntrue;}publicoverrideboolTryGetIndex(GetIndexBinder binder,object[] indexes,outobject result){if(indexes.Length==1&& indexes[0]!=null){if(!_dictionary.TryGetValue(indexes[0].ToString(),out result)){// return null to avoid exception. caller can check for null this way...
result =null;returntrue;}
result =WrapResultObject(result);returntrue;}returnbase.TryGetIndex(binder, indexes,out result);}privatestaticobjectWrapResultObject(object result){var dictionary = result asIDictionary<string,object>;if(dictionary !=null)returnnewDynamicJsonObject(dictionary);var arrayList = result asArrayList;if(arrayList !=null&& arrayList.Count>0){return arrayList[0]isIDictionary<string,object>?newList<object>(arrayList.Cast<IDictionary<string,object>>().Select(x =>newDynamicJsonObject(x))):newList<object>(arrayList.Cast<object>());}return result;}}#endregion}
Występuje błąd w dynamicznym obj = serializer.Deserialize (json, typeof (object)); mówiąc, że nie ma przeciążenia dla metody z 2 argumentami .. niewłaściwy dll czy co?
Stewie Griffin
32
Możesz użyć System.Web.Helpers.Json - oferuje metodę dekodowania, która zwraca obiekt dynamiczny. Te informacje opublikowałem również jako odpowiedź.
Vlad Iliescu
2
Bardzo mi to pomogło, ale jestem ciekawy, co powinienem zrobić, jeśli muszę użyć metody .Serialize, która obecnie generuje tylko NotImplementedException ... Nie jestem zbyt zaznajomiony z zapieczętowanymi klasami i / lub rozszerzonymi abstrakcjami zajęcia Czy ktoś może skierować mnie we właściwym kierunku?
Cory W.
2
czasami w js masz pola ze specjalnymi znakami, takimi jak „kolor tła”. Aby uzyskać dostęp do takich pól w js, musisz zrobić obj ["kolor tła"]. Jak mogę uzyskać dostęp do takich pól od c # po deserializacji do obiektu dynamicznego? Oczywiście nie mogę wykonać obj.background-color, a obj [wydaje się, że kolor tła ”nie działa. Byłoby miło, gdyby do obiektu dynamicznego można było uzyskać dostęp również jako słownik, dokładnie tak jak w js.
Radu Simionescu
2
@RaduSimionescu Prawdopodobnie jestem trochę spóźniony, ale może to pomoże przyszłym odwiedzającym. Miałem ten sam problem, tylko z nazwą pola params(które jest słowem kluczowym w C #). Oprócz tego TryGetMembermożesz zastąpić TryGetIndex, co daje dokładnie takie samo zachowanie jak w JS. Następnie możesz zrobić obj["params"]lub obj["background-color"]dla niezręcznych nazw pól.
@HotLicks: Aby introspekcji dynamicznej stuffzrobić coś takiego:foreach (Newtonsoft.Json.Linq.JProperty jproperty in stuff) { Console.WriteLine("jproperty.Name = {0}", jproperty.Name);}
Matthias
11
Jaka jest różnica między JsonConvert.DeserializeObject i JObject.Parse? Odpowiedź polega na wykorzystaniu ich obu w ten sam sposób, aby zrobić to samo, ale nie wyjaśnia różnicy.
cja
7
@TomPeplow Próbowałem tego. Nie działało to dla mnie. Mówi, że „JObject nie implementuje„ Name ”.
Nie mogę tego uruchomić. Zawęziłem tę kwestię do asyncmetody. Jeśli utworzę metodę synchroniczną, będzie działać zgodnie z oczekiwaniami. Jednak stwórz metodę asynci nie mogę dostać dynamic, po prostu dostaję object. Jawne rzucanie nic nie robi, wciąż daje mi tylko object. Czy ktoś jeszcze tego doświadcza?
codeConcussion,
295
Możesz to zrobić za pomocą System.Web.Helpers.Json - jego metoda dekodowania zwraca obiekt dynamiczny, który możesz przemierzać w dowolny sposób.
Jest on zawarty w zestawie System.Web.Helpers (.NET 4.0).
próbowałeś tego? Powraca Dictionary<string,object>. O ile mi czegoś nie brakuje, twój przykład nie zwraca obiektu dynamicznego.
sergiopereira,
18
To nie działa, po prostu zwraca dyktandę w postaci dynamicznej
mattmanser 30.06.11
55
@Peter Long Myślę, że nie udało mi się jasno przedstawić mojej sprawy, drogi przyjacielu. Pozwól mi spróbować naprawić mój błąd. Wiem, co to jest dynamika. To nie pozwala ci przekazać obiektu JSON i użyć d.code, musisz zrobić d [„kod”]. Wartość, która nie jest tym, czego większość ludzi chce znaleźć w odpowiedzi, wiemy już, jak to zrobić pobierz słownik, a jego dynamiczne rzutowanie to całkowita strata czasu. Z szacunkiem się nie zgadzam, proszę pana.
mattmanser
4
@mattmanser, we already know how to get the dictionary and casting it to a dynamic. To nie musi być dykcja. Json ma również listy oprócz słownika. Można także zagnieżdżać listy i słowniki. Mój kod może obsłużyć wszystkie te sytuacje. ALE twoja metoda NIE może.
Peter Long
4
@mattmanser ma rację; możliwe jest zaimplementowanie IDynamicMetaObjectProvider(lub użycie np. ExpandoObject), który jest w stanie przechwytywać właściwości i wyszukiwać je w wewnętrznym słowniku. To w połączeniu z użyciem dynamicpozwala na użycie takiego kodu d.code. Nie ma sensu przesyłać słownika do dynamiki.
Stephen Drew,
78
Prosty „ciąg danych JSON” do sprzeciwu bez pliku DLL innej firmy:
WebClient client =newWebClient();string getString = client.DownloadString("https://graph.facebook.com/zuck");JavaScriptSerializer serializer =newJavaScriptSerializer();dynamic item = serializer.Deserialize<object>(getString);string name = item["name"];//note: JavaScriptSerializer in this namespaces//System.Web.Script.Serialization.JavaScriptSerializer
Nie rozumiem. To zdecydowanie najprostsze rozwiązanie, o którym nikt nie wspomina.
cikatomo
2
tak, to proste :) kiedyś trzeba serializować, ale nie chce się dołączać trzeciej części dll
İbrahim Özbölük
Można rozwinąć: jak dynamiczny może uzyskać dostęp do rozszeregować obiektu poprzez: myObject["myprop"]? Wiem, że odbywa się to w środowisku wykonawczym, ale jak dostęp do niego myObject["myprop"]jest prawidłowy?
Royi Namir,
1
Możesz deserializować swój obiekt, jak Personel item = serializer.Deserialize <Personel> (getString); a jeśli użyjesz obiektu dynamicznego, możesz również użyć tablicy i wszystko jest możliwe jak każdy obiekt
İbrahim Özbölük
3
Aby użyć przestrzeni nazw System.Web.Script.Serialization, twój projekt potrzebuje odwołania do System.Web.Extensions.
StilgarISCA
28
JsonFx może przekształcić zawartość JSON w postaci szeregowej na obiekty dynamiczne.
Serializacja do / z typów dynamicznych (domyślnie dla .NET 4.0):
Stworzyłem nową wersję DynamicJsonConverter, która wykorzystuje Expando Objects. Użyłem obiektów expando, ponieważ chciałem serializować dynamikę z powrotem do JSON przy użyciu Json.NET.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Dynamic;
using System.Web.Script.Serialization;publicstaticclassDynamicJson{publicstaticdynamicParse(string json){JavaScriptSerializer jss =newJavaScriptSerializer();
jss.RegisterConverters(newJavaScriptConverter[]{newDynamicJsonConverter()});dynamic glossaryEntry = jss.Deserialize(json,typeof(object))asdynamic;return glossaryEntry;}classDynamicJsonConverter:JavaScriptConverter{publicoverrideobjectDeserialize(IDictionary<string,object> dictionary,Type type,JavaScriptSerializer serializer){if(dictionary ==null)thrownewArgumentNullException("dictionary");var result =ToExpando(dictionary);return type ==typeof(object)? result :null;}privatestaticExpandoObjectToExpando(IDictionary<string,object> dictionary){var result =newExpandoObject();var dic = result asIDictionary<String,object>;foreach(var item in dictionary){var valueAsDic = item.ValueasIDictionary<string,object>;if(valueAsDic !=null){
dic.Add(item.Key,ToExpando(valueAsDic));continue;}var arrayList = item.ValueasArrayList;if(arrayList !=null&& arrayList.Count>0){
dic.Add(item.Key,ToExpando(arrayList));continue;}
dic.Add(item.Key, item.Value);}return result;}privatestaticArrayListToExpando(ArrayList obj){ArrayList result =newArrayList();foreach(var item in obj){var valueAsDic = item asIDictionary<string,object>;if(valueAsDic !=null){
result.Add(ToExpando(valueAsDic));continue;}var arrayList = item asArrayList;if(arrayList !=null&& arrayList.Count>0){
result.Add(ToExpando(arrayList));continue;}
result.Add(item);}return result;}publicoverrideIDictionary<string,object>Serialize(object obj,JavaScriptSerializer serializer){thrownewNotImplementedException();}publicoverrideIEnumerable<Type>SupportedTypes{get{returnnewReadOnlyCollection<Type>(newList<Type>(new[]{typeof(object)}));}}}}
dynamic json =newJDynamic("{a:'abc'}");// json.a is a string "abc"dynamic json =newJDynamic("{a:3.1416}");// json.a is 3.1416mdynamic json =newJDynamic("{a:1}");// json.a isdynamic json =newJDynamic("[1,2,3]");/json.Length/json.Countis3// And you can use json[0]/ json[2] to get the elementsdynamic json =newJDynamic("{a:[1,2,3]}");//json.a.Length /json.a.Count is 3.// And you can use json.a[0]/ json.a[2] to get the elementsdynamic json =newJDynamic("[{b:1},{c:1}]");// json.Length/json.Count is 2.// And you can use the json[0].b/json[1].c to get the num.
Następnie musisz mieć instrukcję using dla przestrzeni nazw, w której zdefiniowałeś rozszerzenie (rozważ zdefiniowanie ich w System.Web.Script.Serialization ... inną sztuczką jest nie używanie przestrzeni nazw, wtedy nie potrzebujesz użycia oświadczenie w ogóle) i możesz je spożywać w następujący sposób:
var serializer =newJavaScriptSerializer();varvalue= serializer.DeserializeDynamic("{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 42 }");var name =(string)value.Name;// Jon Smithvar age =(int)value.Age;// 42var address =value.Address;var city =(string)address.City;// New Yorkvar state =(string)address.State;// NY
publicclassChild{publicstring name {get;set;}publicint age {get;set;}}publicclassPerson{publicstring name {get;set;}publicint age {get;set;}publicstring city {get;set;}publicList<Child>Childs{get;set;}}
using Newtonsoft.Json;
namespace GitRepositoryCreator.Common{classJObjects{publicstaticstringGet(object p_object){returnJsonConvert.SerializeObject(p_object);}internalstatic T Get<T>(string p_object){returnJsonConvert.DeserializeObject<T>(p_object);}}}
Możesz to tak nazwać:
Person jsonClass =JObjects.Get<Person>(stringJson);string stringJson =JObjects.Get(jsonClass);
PS:
Jeśli nazwa zmiennej JSON nie jest prawidłową nazwą C # (nazwa zaczyna się od $), możesz to naprawić w następujący sposób:
W tym celu użyłbym JSON.NET do parsowania niskiego poziomu strumienia JSON, a następnie zbudowałbym hierarchię obiektów na podstawie instancji ExpandoObjectklasy.
Jest o wiele za dużo na ponowne opublikowanie tego wszystkiego tutaj, a tym bardziej, że ten artykuł ma załącznik z kluczem / wymaganym plikiem źródłowym.
Teraz deserializujemy ciąg BEZ odwoływania się do powyższych klas:
var dyn =JsonConvert.DeserializeObject<JObject>(jsonAsFooString);JProperty propAge = dyn.Properties().FirstOrDefault(i=>i.Name=="Age");if(propAge !=null){int age =int.Parse(propAge.Value.ToString());Console.WriteLine("age="+ age);}//or as a one-liner:int myage =int.Parse(dyn.Properties().First(i=>i.Name=="Age").Value.ToString());
Lub jeśli chcesz zejść głębiej:
var propBar = dyn.Properties().FirstOrDefault(i=>i.Name=="Bar");if(propBar !=null){JObject o =(JObject)propBar.First();var propBDay = o.Properties().FirstOrDefault(i => i.Name=="BDay");if(propBDay !=null){DateTime bday =DateTime.Parse(propBDay.Value.ToString());Console.WriteLine("birthday="+ bday.ToString("MM/dd/yyyy"));}}//or as a one-liner:DateTime mybday =DateTime.Parse(((JObject)dyn.Properties().First(i=>i.Name=="Bar").First()).Properties().First(i=>i.Name=="BDay").Value.ToString());
Takie podejście umożliwia „przechodzenie” do dokumentu jSON, dzięki czemu można zarządzać sytuacją, w której struktura JSON jest nieznana lub zmienna (na przykład wiele interfejsów API zwraca zupełnie inny dokument JSON, gdy wystąpi błąd). Istnieją inne biblioteki, które to umożliwiają, oprócz Newtonsoft.JSON (alias JSON.NET)?
Alex 75
4
Obiekt, który chcesz DynamicJSONObject, jest zawarty w System.Web.Helpers.dll z pakietu stron sieci Web ASP.NET, który jest częścią WebMatrix.
Użyj DataSet (C #) z JavaScript. Prosta funkcja do tworzenia strumienia JSON z wejściem DataSet. Utwórz zawartość JSON, np. (Zestaw danych z wieloma tabelami):
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;Container container =JsonConvert.Deserialize<Container>(jsonAsString,newExpandoObjectConverter());
var jsonString =(File.ReadAllText(Path.Combine(Directory.GetCurrentDirectory(),"delete_result.json")));var objects =JsonConvert.DeserializeObject<dynamic>(jsonString);foreach(var o in objects){Console.WriteLine($"{o.id.ToString()}");}
Odpowiedzi:
Jeśli chcesz być zależny od
System.Web.Helpers
zestawu, możesz użyćJson
klasy:Jest dołączony do frameworka MVC jako dodatkowe pobranie do frameworku .NET 4. Pamiętaj, aby dać Vladowi głos, jeśli to pomoże! Jeśli jednak nie możesz założyć, że środowisko klienta zawiera tę bibliotekę DLL, czytaj dalej.
Sugerowane jest tutaj alternatywne podejście do deserializacji . Lekko zmodyfikowałem kod, aby naprawić błąd i pasował do mojego stylu kodowania. Wszystko czego potrzebujesz to ten kod i odniesienie do
System.Web.Extensions
twojego projektu:Możesz użyć tego w następujący sposób:
Biorąc pod uwagę ciąg JSON:
Następujący kod będzie działał w czasie wykonywania:
źródło
params
(które jest słowem kluczowym w C #). Oprócz tegoTryGetMember
możesz zastąpićTryGetIndex
, co daje dokładnie takie samo zachowanie jak w JS. Następnie możesz zrobićobj["params"]
lubobj["background-color"]
dla niezręcznych nazw pól.Korzystanie z Json.NET jest dość proste :
Również
using Newtonsoft.Json.Linq
:Dokumentacja: Zapytanie JSON z dynamiką
źródło
stuff
zrobić coś takiego:foreach (Newtonsoft.Json.Linq.JProperty jproperty in stuff) { Console.WriteLine("jproperty.Name = {0}", jproperty.Name);}
async
metody. Jeśli utworzę metodę synchroniczną, będzie działać zgodnie z oczekiwaniami. Jednak stwórz metodęasync
i nie mogę dostaćdynamic
, po prostu dostajęobject
. Jawne rzucanie nic nie robi, wciąż daje mi tylkoobject
. Czy ktoś jeszcze tego doświadcza?Możesz to zrobić za pomocą System.Web.Helpers.Json - jego metoda dekodowania zwraca obiekt dynamiczny, który możesz przemierzać w dowolny sposób.
Jest on zawarty w zestawie System.Web.Helpers (.NET 4.0).
źródło
.NET 4.0 ma wbudowaną bibliotekę, aby to zrobić:
To jest najprostszy sposób.
źródło
Dictionary<string,object>
. O ile mi czegoś nie brakuje, twój przykład nie zwraca obiektu dynamicznego.we already know how to get the dictionary and casting it to a dynamic
. To nie musi być dykcja. Json ma również listy oprócz słownika. Można także zagnieżdżać listy i słowniki. Mój kod może obsłużyć wszystkie te sytuacje. ALE twoja metoda NIE może.IDynamicMetaObjectProvider
(lub użycie np.ExpandoObject
), który jest w stanie przechwytywać właściwości i wyszukiwać je w wewnętrznym słowniku. To w połączeniu z użyciemdynamic
pozwala na użycie takiego kodud.code
. Nie ma sensu przesyłać słownika do dynamiki.Prosty „ciąg danych JSON” do sprzeciwu bez pliku DLL innej firmy:
Uwaga: Możesz również użyć własnego obiektu.
źródło
myObject["myprop"]
? Wiem, że odbywa się to w środowisku wykonawczym, ale jak dostęp do niegomyObject["myprop"]
jest prawidłowy?JsonFx może przekształcić zawartość JSON w postaci szeregowej na obiekty dynamiczne.
źródło
Stworzyłem nową wersję DynamicJsonConverter, która wykorzystuje Expando Objects. Użyłem obiektów expando, ponieważ chciałem serializować dynamikę z powrotem do JSON przy użyciu Json.NET.
źródło
Innym sposobem jest użycie Newtonsoft.Json :
źródło
Możesz to osiągnąć za pomocą Newtonsoft.Json. Zainstaluj Newtonsoft.Json z Nuget i:
źródło
Najprostszym sposobem jest:
Wystarczy dołączyć ten plik DLL .
Użyj następującego kodu:
źródło
Możesz rozszerzyć JavaScriptSerializer, aby rekurencyjnie kopiować utworzony słownik do rozwijania obiektów, a następnie używać ich dynamicznie:
Następnie musisz mieć instrukcję using dla przestrzeni nazw, w której zdefiniowałeś rozszerzenie (rozważ zdefiniowanie ich w System.Web.Script.Serialization ... inną sztuczką jest nie używanie przestrzeni nazw, wtedy nie potrzebujesz użycia oświadczenie w ogóle) i możesz je spożywać w następujący sposób:
źródło
Możesz użyć
using Newtonsoft.Json
resolvedEvent.Event.Data
to moja odpowiedź otrzymana od wywołania zdarzenia podstawowego.źródło
Korzystam z http://json2csharp.com/, aby uzyskać klasę reprezentującą obiekt JSON.
Wejście:
Wynik:
Następnie używam Newtonsoft.Json do wypełnienia klasy:
Możesz to tak nazwać:
PS:
Jeśli nazwa zmiennej JSON nie jest prawidłową nazwą C # (nazwa zaczyna się od
$
), możesz to naprawić w następujący sposób:źródło
W tym celu użyłbym JSON.NET do parsowania niskiego poziomu strumienia JSON, a następnie zbudowałbym hierarchię obiektów na podstawie instancji
ExpandoObject
klasy.źródło
Używam tego w moim kodzie i działa dobrze
źródło
Spójrz na artykuł, który napisałem na CodeProject, taki, który dokładnie odpowiada na pytanie:
Typy dynamiczne z JSON.NET
Jest o wiele za dużo na ponowne opublikowanie tego wszystkiego tutaj, a tym bardziej, że ten artykuł ma załącznik z kluczem / wymaganym plikiem źródłowym.
źródło
Inną opcją jest „Wklej JSON jako klasy”, aby można było szybko i łatwo dokonać deserializacji.
Oto lepsze wyjaśnienie n piccas ... „Wklej JSON jako klasy” w ASP.NET i Web Tools 2012.2 RC
źródło
Deserializacja w JSON.NET może być dynamiczna przy użyciu
JObject
klasy zawartej w tej bibliotece. Mój ciąg JSON reprezentuje następujące klasy:Teraz deserializujemy ciąg BEZ odwoływania się do powyższych klas:
Lub jeśli chcesz zejść głębiej:
Zobacz post dla kompletnego przykładu.
źródło
Obiekt, który chcesz DynamicJSONObject, jest zawarty w System.Web.Helpers.dll z pakietu stron sieci Web ASP.NET, który jest częścią WebMatrix.
źródło
Istnieje lekka biblioteka JSON dla języka C # o nazwie SimpleJson .
Obsługuje .NET 3.5+, Silverlight i Windows Phone 7.
Obsługuje dynamikę dla .NET 4.0
Może być również zainstalowany jako pakiet NuGet
źródło
Użyj DataSet (C #) z JavaScript. Prosta funkcja do tworzenia strumienia JSON z wejściem DataSet. Utwórz zawartość JSON, np. (Zestaw danych z wieloma tabelami):
Po stronie klienta, użyj eval. Na przykład,
Następnie użyj:
źródło
Aby uzyskać obiekt ExpandoObject:
źródło
Spróbuj tego:
źródło
Jak analizować łatwe treści JSON za pomocą Dynamic & JavaScriptSerializer
Dodaj odniesienie do System.Web.Extensions i dodaj tę przestrzeń nazw
using System.Web.Script.Serialization;
u góry:Jak analizować zagnieżdżone i złożone pliki Json za pomocą Dynamic & JavaScriptSerializer
Dodaj odniesienie do System.Web.Extensions i dodaj tę przestrzeń nazw
using System.Web.Script.Serialization;
u góry:źródło
Z Cinchoo ETL - biblioteką open source dostępną do parsowania JSON w obiekt dynamiczny:
Wynik:
Oświadczenie: Jestem autorem tej biblioteki.
źródło
spróbuj w ten sposób!
Przykład JSON:
Kod C #:
źródło