2015-09-07 58 views
-2

我有一個奇怪的JSON字符串需要在C#中解析。我該怎麼做。我試圖解析它作爲Dictionary,但它失敗了。我能以某種方式創建一個hashmap嗎?如何在C中解析JSON#

Dictionary<string, string> values = JsonConvert.DeserializeObject<Dictionary<string, string>>(response); 

JSON字符串是here

我正在使用的API這個數據。這是我收到的錯誤。

無法反序列化當前JSON數組(例如[1,2,3])爲類型'System.Collections.Generic.Dictionary`2 [System.String,System.String]',因爲該類型需要JSON對象(例如{「name」:「value」})來正確地反序列化。

爲了解決這個錯誤或者改變JSON來JSON對象(例如{「名稱」:「值」})或改變反序列化類型到一個數組或一個實現的集合接口類型(例如ICollectionIList)像List<T>可以從JSON數組反序列化。 JsonArrayAttribute也可以添加到該類型以強制它從JSON數組反序列化。

+2

鏈接不起作用 – nozzleman

+0

這個問題完全沒有意義,並強調爲什麼我們不應該指向第三方資源。 – spender

+0

你得到了什麼樣的失敗? –

回答

0

我看到的是你已經指出JSON有規則的結構,你應該創建一個包裝模型,看看下面的例子,或者在https://dotnetfiddle.net/TGWTNC中玩。

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


public class Program 
{ 
    public static void Main(string[] args) 
    { 

     var webClient = new WebClient(); 
     var json = webClient.DownloadString("https://gist.githubusercontent.com/maskaravivek/33aa0d6556bbb9ecb77a/raw/b815daa55719a754eef5117321e2c0c5621c6a18/gistfile1.txt"); 
     var notifications = JsonConvert.DeserializeObject<Notification[]>(json); 

     Console.WriteLine(notifications.Count()); 
     Console.ReadLine(); 
    } 
} 

//adjust the data types according to your needs 
public class Notification 
{ 
    public string notificationId { get; set; } 
    public string readFlag { get; set; } 
    public string importantFlag { get; set; } 
    public string subject { get; set; } 
    public string folder { get; set; } 
    public string creationTime { get; set; } 
    public string notificationCount { get; set; } 
    public string jobId { get; set; } 
    public Dictionary<string, string> recruitersMap { get; set; } 
    public Dictionary<string, string> jobsMap { get; set; } 
} 
4

您的JSON數據不適合在Dictionary<string,string>的形狀,因爲在其頂部的水平,這不是一本字典。它是一組對象。

你需要寫你的數據的形狀相匹配的自定義類型(class),然後反序列化到這種類型的集合。

因此,廣泛(未經測試的代碼...)來說

public class SomeType 
{ 
    public string notificationId{ get; set; } 
    //etc 
    public Dictionary<string,string> recruitersMap{ get; set; } 
    //etc 
} 

然後

JsonConvert.Deserialize<List<SomeType>>(someJson) 
1

這是因爲你的JSON不代表Dictionary<string, string>recruitersMapjobsMap都嵌套object s或集合,而不是string s。

你可以創建一個POCO類

public class ApiEndPoint // you will find a better name, I'm sure 
    { 
     public string notificationId { get; set; } 
     public string readFlag { get; set; } 
     public string importantFlag { get; set; } 
     public string subject { get; set; } 
     public string folder { get; set; } 
     public DateTime creationTime { get; set; } 
     public int notificationCount { get; set; } 
     public string jobId { get; set; } 
     public Dictionary<string, string> recruitersMap { get; set; } 
     public Dictionary<string, string> jobsMap { get; set; } 
    } 

和反序列化JSON到像這樣的類的對象:

JsonConvert.DeserializeObject<List<ApiEndPoint>>(yourJsonString);