2017-07-25 51 views
0

我有一个element类,它包含一个options财产,期权类又可以改变其属性,例如可能有这2反序列化动态属性在ASP.net Web的API

Element1 = { 
    "Id": "1", 
    "Options": { 
     "Printable": "true", 
     "StackOverflow": "great" 
    } 
} 

Element2 = { 
    "Id": "2", 
    "Options": { 
     "Question": "awsome", 
     "PropertyDiferent": "empty" 
    } 
} 

在网页API我有一个这样的方法:

Public object Post ([FromBody] Element element) 
{ 
    SaveToMongo (element); 
} 

元素类:

Public class Element 
{ 
    Public dynamic options {get; set; } 
    Public string id {get; set; } 
} 

当我从Mongo拿起元素时,我没有任何问题。但是,当我使用Api web的post方法发送它时,它并不反序列化它自己,在expando对象中,因为它是从Mongo开始的。我怎么能在两端得到类似的行为?

编辑:我试图将选项从动态更改为newtonsoft JObject,但它没有奏效。现在选项也得到了保存,但是他们生成了我不想要的父亲。

"options" : { 
      "_t" : "Newtonsoft.Json.Linq.JObject, Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed", 
      "_v" : { 
       "padding" : { 
        "_t" : "JArray", 
        "_v" : [ 
         { 
          "_t" : "JValue", 
          "_v" : [ 

          ] 
         }, 
         { 
          "_t" : "JValue", 
          "_v" : [ 

          ] 
         }, 
         { 
          "_t" : "JValue", 
          "_v" : [ 

          ] 
         }, 
         { 
          "_t" : "JValue", 
          "_v" : [ 

          ] 
         } 
        ] 
       }, 
       "image" : { 
        "_t" : "JValue", 
        "_v" : [ 

        ] 
       }, 
       "alt" : { 
        "_t" : "JValue", 
        "_v" : [ 

        ] 
       }, 
       "url" : { 
        "_t" : "JValue", 
        "_v" : [ 

        ] 
       }, 
       "width" : { 
        "_t" : "JValue", 
        "_v" : [ 

        ] 
       }, 
       "backgroundColor" : { 
        "_t" : "JValue", 
        "_v" : [ 

        ] 
       }, 
       "text" : { 
        "_t" : "JValue", 
        "_v" : [ 

        ] 
       } 
      } 
     }, 

有更多的属性,因为我直接从mongo中提取示例。

+0

你可以使用Newtonsoft.Json的JObject而不是动态的吗? –

+0

@PedroDrewanz我会尝试一下。因为这几天我的一些问题都是失败的。 –

回答

0

第一步,使来自javascript的ajax调用将JSON作为字符串传递,否则不会填充动态属性选项。

Element.options = element.options.toString(); 

所以我有一个JSON字符串,虽然它存储在mongo中,我可以在不修改的情况下恢复它。但是为了能够在Api中返回它,我必须在控制器本身完成反序列化之前将其反序列化。

Element.options = JObject.Parse (element.options); 

这是一个uncool系统,有一些缺点,因为它不允许mongo中的选项的处理。但是,这一直是我设法蒙戈的通道没有改变目标的唯一方法。