Десериализовать Json в динамический объект с помощью ServiceStack.Text

Я использую ServiceStack.Text для десериализации JSON в динамический объект.

Я сталкиваюсь с ошибкой при попытке десериализации следующего json:

{
  "responseHeader":{
    "status":0,
    "QTime":3,
    "params":{
      "q":"*:*",
      "indent":"true",
      "wt":"json"}},
  "response":{"numFound":1,"start":0,"docs":[
      {
        "id":"1",
        "title":["test"],
        "_version_":1480260331707039744}]
  }}

JSON выше - это строка, и вот как я пытаюсь ее десериализовать:

DynamicJson dyn = DynamicJson.Deserialize(json);    
var response = dyn.response;

Но я получаю сообщение об ошибке: dyn не содержит определения "ответа"


dyn возвращает тип ServiceStack.DynamicJson со следующим значением (из отладчика):

{"response_header":"{\n    \"status\":0,\n    \"QTime\":0,\n    \"params\":{\n      \"q\":\"*:*\",\n      \"size\":\"0\",\n      \"indent\":\"True\",\n      \"start\":\"0\",\n      \"wt\":\"json\",\n      \"return-fields\":\"\"}}","response":"{\"numFound\":1,\"start\":0,\"docs\":[\n      {\n        \"id\":\"1\",\n        \"title\":[\"test\"],\n        \"_version_\":1480260331707039744}]\n  }"}    ServiceStack.DynamicJson

В соответствии с ответом здесь: Использование ServiceStack.Text для десериализации строки json для объекта - вот как это делается, но что я здесь делаю неправильно?

1 ответ

Решение

Даже если DynamicJson.Deserialize на самом деле возвращает экземпляр DynamicJson, ты должен объявить dyn как dynamic лечить это динамически:

dynamic dyn = DynamicJson.Deserialize(json);    
var response = dyn.response;

Согласно документации для DynamicObject (который DynamicJson наследует от):

В C# для включения динамического поведения для экземпляров классов, производных от класса DynamicObject, необходимо использовать ключевое слово dynamic.

Если выражение не имеет типа dynamicстатическое связывание все равно будет происходить, поэтому вы видите ошибку.

Другие вопросы по тегам