我建設,需要從第三方Web服務使用JSON C#應用程序。看起來第三方使用Java來生成JSON,因爲在返回的字符串中有Java類型信息(例如,下面的「com.company.RegistrationDetail」)。具體而言,複雜的對象開始與「@type」屬性:如何在反序列化JSON時刪除或忽略Java類型提示?
...
"registration": {
"@type": "com.company.RegistrationDetail",
"id": "regdw000000000003551",
"displayName": "Registration 3551"
},
...
顯然,這種「@type」值是在C#中對我沒有用。因爲它只是一個屬性,但是很容易忽略。數組是另一回事:
...
"warnings": [
"java.util.ArrayList",
[
"Warning #1",
"Warning #2"
]
],
...
的「警告」陣列表示爲包含類型名稱,然後嵌套陣列與實際警告項的字符串。這干擾了我的反序列化器(JSON.NET),因爲「警告」中的項目類型不一致。
我可以將JSON的每個塊反序列化爲JObject或JArray,但這將非常乏味,因爲Web服務的輸出非常複雜,具有多個嵌套對象和數組級別。理想情況下,我想能夠使用類似json2csharp從JSON輸出生成C#類,然後在一次類似反序列化的一切:
JsonConvert.DeserializeObject<GeneratedResponseClass>(jsonResponseData);
這是在Java中衆所周知的編碼技術(即嵌入型信息進入JSON)?在C#中反序列化JSON時,有什麼方法去除或忽略此Java類型信息?
下面是一個更完整的樣品(有很多多餘屬性和嵌套對象的移除)。我想獲得orderDetail - > orderItems [0] - > registration - > id的值。
{
"@type":"com.company.learning.services.registration.OrderResult",
"orderId":"intor000000000004090",
"orderDetail":{
"@type":"com.company.learning.services.registration.OrderDetail",
"orderStatus":"Confirmed",
"orderItems":[
"list",
[
{
"@type":"com.company.learning.services.registration.OrderItemDetail",
"registration":{
"@type":"ServiceObjectReference",
"id":"regdw000000000003551",
"displayName":""
},
"quantity":null,
"itemStatusDescription":"Registered"
}
]
],
"orderContact":"Sample Person",
"orderNumber":"00003911",
"orderDate":{
"@type":"com.company.customtypes.DateWithLocale",
"date":1437425816000,
"locale":"20-JUL-2015",
"timeInUserTimeZone":"3:56 PM",
"timeInCustomTimeZone":null,
"dateInCustomTimeZone":null,
"customTimeZoneDate":0,
"timeInLocale":"4:56 PM",
"dateInUserTimeZone":"20-JUL-2015"
}
}
}
我在您的列表中沒有看到與「Java類型」相關的任何內容。它們只是類型對象(或JObject/JArray)的列表。發佈一個有效的json並顯示你想要從中獲得什麼。 – EZI
而不是反序列化您的對象,desieralize JObject/JArray。然後找出那裏的類型,並反序列化到你的對象。 –
@EZI,這就是「com.company.RegistrationDetail」。我可以一塊一塊地抓取JSON,將每一個位反序列化爲一個JObject或JArray,但是對於大量的嵌套對象和數組來說它確實很大。出於同樣的原因,我沒有發佈整個JSON響應的示例。由於我對Java不熟悉,因此我不知道這是否是該領域衆所周知的。我已經澄清了相應的問題。 –