使用ServiceStack.Text将Json反序列化为动态对象

4
我正在使用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不包含'response'的定义


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个回答

5
尽管DynamicJson.Deserialize确实返回DynamicJson的实例,但您必须将dyn声明为dynamic才能动态处理它:
dynamic dyn = DynamicJson.Deserialize(json);    
var response = dyn.response;

根据DynamicObject的文档(DynamicJson继承自该类):
在C#中,为了使从DynamicObject类继承的类实例具有动态行为,必须使用dynamic关键字。如果表达式不是dynamic类型,则仍将发生静态绑定,这就是为什么您会看到错误的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接