2015-07-21 82 views
0

我建設,需要從第三方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" 
     } 
    } 
} 
+2

我在您的列表中沒有看到與「Java類型」相關的任何內容。它們只是類型對象(或JObject/JArray)的列表。發佈一個有效的json並顯示你想要從中獲得什麼。 – EZI

+0

而不是反序列化您的對象,desieralize JObject/JArray。然後找出那裏的類型,並反序列化到你的對象。 –

+0

@EZI,這就是「com.company.RegistrationDetail」。我可以一塊一塊地抓取JSON,將每一個位反序列化爲一個JObject或JArray,但是對於大量的嵌套對象和數組來說它確實很大。出於同樣的原因,我沒有發佈整個JSON響應的示例。由於我對Java不熟悉,因此我不知道這是否是該領域衆所周知的。我已經澄清了相應的問題。 –

回答

1

根據最終JSON,你的模型應該是:

public class Registration 
{ 
    public string id { get; set; } 
    public string displayName { get; set; } 
} 

public class Order 
{ 
    public Registration registration { get; set; } 
    public object quantity { get; set; } 
    public string itemStatusDescription { get; set; } 
} 

public class OrderDate 
{ 
    public long date { get; set; } 
    public string locale { get; set; } 
    public string timeInUserTimeZone { get; set; } 
    public object timeInCustomTimeZone { get; set; } 
    public object dateInCustomTimeZone { get; set; } 
    public int customTimeZoneDate { get; set; } 
    public string timeInLocale { get; set; } 
    public string dateInUserTimeZone { get; set; } 
} 

public class OrderDetail 
{ 
    public string orderStatus { get; set; } 
    public List<Order> orderItems { get; set; } 
    public string orderContact { get; set; } 
    public string orderNumber { get; set; } 
    public OrderDate orderDate { get; set; } 
} 

public class RootObject 
{ 
    public string orderId { get; set; } 
    public OrderDetail orderDetail { get; set; } 
} 

這是Converter類

public class JavaArrayConverter : JsonConverter 
{ 
    Type _Type = null; 
    public override bool CanConvert(Type objectType) 
    { 
     if(objectType.IsGenericType) 
     { 
      _Type = typeof(List<>).MakeGenericType(objectType.GetGenericArguments()[0]); 
      return objectType == _Type; 
     } 
     return false; 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     var jArray = JArray.Load(reader); 
     return jArray[1].ToObject(_Type); //jArray[0] is the "java-type" 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 
} 

現在你可以爲反序列化:

var root = JsonConvert.DeserializeObject<RootObject>(DATA, new JavaArrayConverter()); 
+0

謝謝,我有空餘時間試試看。順便說一句,你的頭像讓我口渴,哈哈! –

+0

@MattPeterson這是我在做什麼知道:) – EZI

+0

我最終去了不同的路線(具體而言,嘗試分析它之前清理JSON),但是這是一個偉大的小費仍然。在JSON.NET中創建自定義轉換器的能力很好。 –

相關問題