Разбор JSON на анонимный объект[] с помощью JSON.net

у меня есть строка json, которую я хочу разобрать на объект []:

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

результирующий массив анонимных объектов должен содержать каждое из свойств исходного объекта json. Моя проблема в том, что JsonConvert.DeserializeObject возвращает тип JContainer или JObject. Я не смог определить способ возврата простого объекта vanilla c#.

Это мой текущий рабочий код от множества предыдущих попыток. Я не должен использовать JSON.net но я ... хотелось бы, если возможно, обеспечить совместимость с кодом, генерирующим json.

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

обновление

Я использую созданный массив объектов для вызова методов через отражение. Типы анализируемых объектов json не известны во время выполнения. Проблема заключается в том, что типы объектов JObject или JContainer не соответствуют сигнатурам вызываемых методов. Динамичный такой же побочный эффект. Методы вызываются как это:

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

4 ответов


вы можете десериализовать на примере, используя анонимный тип:

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

другой путь внутри Json.Net он использует динамический объект, подобный этому:

dynamic result2=JObject.Parse(jsonString);

немного другой вариант использования, в котором строка JSON представляет собой массив анонимных типов, будет работать следующее. По сути, он просто обертывает анонимные типы внутри массива.

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

это приводит к следующему, как визуализируется помощью linqpad.

enter image description here


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

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

?

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

?