Pytanie Parsuj JSON w anonimowy obiekt [] używając JSON.net


Mam ciąg json, który chcę analizować w obiekcie []:

{ "Thing":"Thing","That":{"Item1":15,"Item2":"Moo","Item3":{"Count":27,"Type":"Frog"}}}

Wynikowa anonimowa tablica obiektów musi zawierać każdą z właściwości oryginalnego obiektu json. Mój problem polega na tym, że JsonConvert.DeserializeObject zwraca typ JContainer lub JObject. Nie byłem w stanie zidentyfikować sposobu zwracania zwykłego obiektu c # wanilli.

To jest mój obecny niefunkcjonalny kod z tablicy poprzednich prób. Nie muszę używać JSON.net, ale chciałbym, jeśli to możliwe, zapewnić zgodność z kodem generującym json.

JObject deserialized = JsonConvert.DeserializeObject<JObject>(dataString);
object[] data =
deserialized.Children().Where(x => x as JProperty != null).Select(x => x.Value<Object>()).ToArray();

Aktualizacja

Używam produkowanej macierzy obiektów do wywoływania metod poprzez odbicie. Typy parsowanych obiektów json nie są znane w czasie wykonywania. Problem polegający na tym, że obiekty JObject lub JContainer nie są zgodne z sygnaturami wywoływanych metod. Dynamiczny ma ten sam efekt uboczny. Metody są wywoływane w ten sposób:

Type _executionType = typeof(CommandExecutionDummy);
CommandExecutionDummy provider = new CommandExecutionDummy();
var method = _executionType.GetMethod(model.Command,
               BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static);
if (method == null)
   throw new InvalidCommandException(String.Format("Invalid Command - A command with a name of {0} could not be found", model.Command));
return method.Invoke(provider, model.CommandData);

14
2017-11-11 23:29


pochodzenie


Co próbujesz osiągnąć? - dcastro
Obiekt, którego typem runtime jest Object nie będzie miał żadnych właściwości. Co jest nie tak z JContainer lub JObject lub używając go jako dynamic? - Tim S.


Odpowiedzi:


możesz deserializować za pomocą przykładu, używając anonimowego typu:

string jsonString = "{name:\"me\",lastname:\"mylastname\"}";
var typeExample = new { name = "", lastname = "",data=new int[]{1,2,3} };
var result=JsonConvert.DeserializeAnonymousType(jsonString,typeExample);
int data1=result.data.Where(x => 1);

Innym sposobem w Json.Net jest użycie dynamicznego obiektu takiego jak ten:

dynamic result2=JObject.Parse(jsonString);

18
2017-11-11 23:55



"dynamiczny" typ jest idealny, jeśli nie chcę tworzyć szablonu json: // obiekty z projektów dynamicznych API TFS REST = JsonConvert.DeserializeObject <JObject> (jsonProjects); var projectName = projects.value [0] .name; - Edward Weinert


Nieco inny przypadek użycia, w którym ciąg JSON jest tablicą anonimowych typów, które będą działać. Zasadniczo po prostu opakowuje anonimowe typy w tablicy.

string json = "[{\"Type\":\"text/xml\",\"Allowed\":\"true\"},{\"Type\":\"application/pdf\",\"Allowed\":\"true\"},{\"Type\":\"text/plain\",\"Allowed\":\"true\"}]";
JsonConvert.DeserializeAnonymousType(json, new[] { new { Type = "", Allowed = true } });

Powoduje to, że wizualizowane przez Linqpad.

enter image description here


5
2017-12-16 23:29





string jsonString = "{ "Thing":"Thing","That":{"Item1":15,"Item2":"Moo","Item3":{"Count":27,"Type":"Frog"}}}"

Object[] data = JsonConvert.DeserializeObject<Object>(jsonString);

?

1
2017-11-11 23:50





JObject.Parse(jsonString).ToObject<MyType>()

?


-1
2017-11-11 23:42