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

时间:2014-09-27 23:03:37

标签: c# asp.net asp.net-mvc 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

根据这里的答案:Using ServiceStack.Text to deserialize a json string to object它是如何完成的,但我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

即使DynamicJson.Deserialize确实返回DynamicJson的实例,您也必须将dyn声明为dynamic才能动态处理它:

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

根据DynamicObject的文档(DynamicJson继承自:)

  

在C#中,要为从DynamicObject类派生的类的实例启用动态行为,必须使用动态关键字

如果表达式不是dynamic类型,静态绑定仍会发生,这就是您看到错误的原因。