2017-08-10 55 views
-4

我消費,返回以下JSON的API:反序列化Json的頂級陣列和第一個未命名的對象

[ 
    { 
     "product": { 
      "id": 2, 
      "name": "Auto" 
     } 
    } 
] 

所以,我想在C#中的對象wihout成功反序列化這一點。

我想了很多其他的stackoverflow解決方案。

這裏是我的嘗試:

​​

的問題是JSON與[]和我們的泛型方法開始(我是從一個內部框架使用)無法因與它。我得到以下異常:

不能反序列化JSON當前陣列(例如[1,2,3])到類型....

感謝@EZI和@eocron爲有效解決方案的。

+0

你有什麼試過?你知道http://json2csharp.com嗎?你使用Json.Net嗎? –

+1

哦,真的嗎?你可以與我們分享這些解決方案嗎,所以我們會更多地瞭解問題。 – eocron

+0

,看起來不像一個有效的JSON ...以及不知道你是否意味着一個JSON數組或什麼? – Rahul

回答

1

您應該反序列化爲數組/列表。下面的代碼應該工作...

var list = JsonConvert.DeserializeObject<List<Item>>(json); 

public class Product 
{ 
    public int id { get; set; } 
    public string name { get; set; } 
} 

public class Item 
{ 
    public Product product { get; set; } 
} 
+0

我的猜測.. OP可能意味着一個'Product []'而不是 – Rahul

+0

不錯。但是,在我的公司,我們正在與SOA合作,並且我們有一些框架,其中一個是從外部API獲取,我發現我們的方法不準備使用這種類型的JSON(在開始時使用數組)。 所以,我非常感謝你的回答。這是有效的,工作得很好。我會用一些Json來測試它。 –

1

有兩種解決方案來解決你的問題,考慮你想使用你的對象的方式。

第一個是簡單地創建DTO具有相同的字段。當您需要完全控制用於:

using System.Collections.Generic; 
using System.Runtime.Serialization; 
using Newtonsoft.Json; 
using Newtonsoft.Json.Serialization; 

namespace ConsoleTest 
{ 
    class Program 
    { 
     [DataContract] 
     public class Example 
     { 
      [DataMember] 
      public Product Product { get; set; } 
     } 

     [DataContract] 
     public class Product 
     { 
      [DataMember] 
      public int Id { get; set; } 
      [DataMember] 
      public string Name { get; set; } 
     } 

     static void Main(string[] args) 
     { 
      var json = @" 
          [ 
           { 
            ""product"": { 
             ""id"": 2, 
             ""name"": ""Auto"" 
            } 
           } 
          ]"; 

      var obj = JsonConvert.DeserializeObject<List<Example>>(json, 
                 new JsonSerializerSettings 
                 { 
                  ContractResolver = new CamelCasePropertyNamesContractResolver() 
                 }); 
     } 
    } 
} 

第二個,當你想從JSON幾個字段,不那麼在意一切,並採用動態使用。易於使用,易於使用,看起來不錯,但不是很安全:

using System.Collections.Generic; 
using Newtonsoft.Json; 

namespace ConsoleTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var json = @" 
          [ 
           { 
            ""product"": { 
             ""id"": 2, 
             ""name"": ""Auto"" 
            } 
           } 
          ]"; 

      dynamic list = JsonConvert.DeserializeObject<List<dynamic>>(json); 
      var id = (int)list[0].product.id; 
     } 
    } 
} 
+0

非常感謝eocron。你的解決方案效果很好。 我已要求我們的架構師實施解決方案,以JSON開頭並以[]開頭。 –