2015-12-08 47 views
1

我有一個與JSON格式的維基百科API。現在我想從這個API獲取提取信息。我想讓它對任何維基百科API都是動態的。 [我的維基百科api] [1]。我從jsontoCsharpJson反編譯從維基百科API與C#

namespace Json_deserialize 
{ 
    public class pageval 
    { 
    public int pageid { get; set; } 
    public int ns { get; set; } 
    public string title { get; set; } 
    public string extract { get; set; } 
} 


public class Query 
{ 
    public Dictionary<string, pageval> pages { get; set; } 
} 

public class Limits 
{ 
    public int extracts { get; set; } 
} 

public class RootObject 
{ 
    public string batchcomplete { get; set; } 
    public Query query { get; set; } 
    public Limits limits { get; set; } 
} 

class Short_text 
    { 
    public static RichTextBox txt1 = new RichTextBox(); 
    public static void shortText() 
    { 
     using (WebClient wc = new WebClient()) 
     { 
      var client = new WebClient(); 
      var response = client.DownloadString("https://en.wikipedia.org/w/api.php?format=json&action=query&prop=extracts&exlimit=max&explaintext&exintro&titles=Neuschwanstein%20Castle&redirects="); ; 

      pageval m = JsonConvert.DeserializeObject<pageval>(response); 

      string result = m.extract; 

      txt1.Text = result; 
     } 

     } 

    } 

}

我想做出這樣的應該是動態編碼以下信息。這意味着id 240912應該及時更改。我嘗試了很多。但不能得到滿意的結果。

+0

變化'pages'到'詞典<字符串,對象>'然後刪除'Pages'和'__invalid_type__240912'類 – Rob

+0

謝謝你的回答。你可以請多解釋一下,因爲我在JSON處理方面頗爲新穎。 @Rob – user3193794

+0

所有JSON對象本質上都是字典。但是,假定模式是常量,那麼將它們表示爲C#中的類通常是有意義的。對於*屬性名稱*不總是相同的情況,不可能編寫一個類來表示該對象;所以你多使用'dynamic'或'Dictionary ' – Rob

回答

2

所有JSON對象本質上都是字典。但是,假定模式是常量,那麼將它們表示爲C#中的類通常是有意義的。對於屬性名稱不總是相同的情況,不可能編寫一個類來表示對象;所以你多使用動態或字典

public class pageval 
{ 
    public int pageid { get; set; } 
    public int ns { get; set; } 
    public string title { get; set; } 
    public string extract { get; set; } 
} 


public class Query 
{ 
    public Dictionary<string, pageval> pages { get; set; } 
} 

public class Limits 
{ 
    public int extracts { get; set; } 
} 

public class RootObject 
{ 
    public string batchcomplete { get; set; } 
    public Query query { get; set; } 
    public Limits limits { get; set; } 
} 

要獲得提取物:

var response = client.DownloadString("https://en.wikipedia.org/w/api.php?format=json&action=query&prop=extracts&exlimit=max&explaintext&exintro&titles=Neuschwanstein%20Castle&redirects="); ; 

var responseJson = JsonConvert.DeserializeObject<RootObject>(response); 
var firstKey = responseJson.query.pages.First().Key; 
var extract = responseJson.query.pages[firstKey].extract; 
+0

我想從invalid_type__240912中獲取摘錄。我如何獲得它。 – user3193794

+0

@ user3193794你需要做'頁面[「240912」]' – Rob

+0

@ user3193794你可以更具體嗎?什麼不適用於這個代碼?你改變你的反序列化來做'pageval m = JsonConvert.DeserializeObject (response);'? – Rob

0

我覺得像這樣的一些東西會工作,你

public class pageval 
{ 
    public int pageid { get; set; } 
    public int ns { get; set; } 
    public string title { get; set; } 
    public string extract { get; set; } 
} 


public class Query 
{ 
    public Dictionary<string, pageval> pages { get; set; } 
} 

public class Limits 
{ 
    public int extracts { get; set; } 
} 

public class RootObject 
{ 
    public string batchcomplete { get; set; } 
    public Query query { get; set; } 
    public Limits limits { get; set; } 
} 
+0

謝謝您的回答。你能告訴我如何從pageval中獲取摘錄嗎? @Anik 1991 – user3193794

+0

var arrayOfAllKeys = pages.Keys.ToArray(); 通過這個,你從它得到的鑰匙 然後 pageval測試; \t if(values.TryGetValue(arrayOfAllKeys [0],out test))//返回true。 \t { \t Console.WriteLine(test); //這是貓的價值。 \t} –

+0

不,它不起作用 – user3193794