2015-02-06 98 views
0

請幫助我,我是新的C#和JSON工作。我想使用newtonsoft命名空間反序列化C#中的json數據。反序列化數組json c#

這裏是我的課:

class lastResponse 
{ 
    public string type { get; set; } 
    public Metadata metadata { get; set; } 
    // public string[] course { get; set; } 
    public List<object> course { get; set; } 
    public string publisher { get; set; } 
} 

public class Metadata 
{ 
    public string bookID { get; set; } 
    public string title { get; set; } 
    public string filename { get; set; } 
} 

此代碼:

var errorMsg = JsonConvert.DeserializeObject<lastResponse>(downloader.LastResponse); 

給了我這個錯誤:

"An unhandled exception of type 'Newtonsoft.Json.JsonSerializationException' occurred in Newtonsoft.Json.dll Additional information: Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'BookManager.lastResponse' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly." 

請幫我找出我在這裏失蹤。

+0

對我來說這似乎不太可能是*完整*錯誤。如果這是一個例外,請發佈完整的堆棧跟蹤。如果這是編譯時錯誤,請發佈完整的錯誤。 – 2015-02-06 10:33:00

+0

可以顯示'downloader.LastResponse'這個'string' – 2015-02-06 10:33:53

+0

@JonSkeet這是我得到的錯誤「Newtonsoft.Json.Json.dll中發生類型'Newtonsoft.Json.JsonSerializationException'的未處理異常 其他信息:不能將當前JSON數組(例如[1,2,3])反序列化爲類型'BookManager.lastResponse',因爲該類型需要JSON對象(例如{「name」:「value」})才能正確地反序列化。 – Red 2015-02-06 10:56:25

回答

0

最可能的原因可能是你從downloader.LastResponse得到的json不是數組。

你的Json可能是這樣的。

{ 
    "type": "First", 
    "metadata": { 
     "bookID": "book123", 
     "title": "bookTitle Here", 
     "filename": "book file name" 
    }, 
    "course": [ 
     { 
      "1": "01", 
      "2": "02" 
     }, 
     { 
      "001": "001", 
      "002": "002" 
     } 
    ], 
    "publisher": "you" 
} 

你需要改變什麼或者是通過JSON數組中downloader.LastResponse或者您也可以按照以下步驟改變你的反序列化對象的語句。

JsonConvert.DeserializeObject<lastResponse>(downloader.LastResponse); 

根據你在做什麼,正確的JSON將是這樣的。

**[** 
    { 
     "type": "First", 
     "metadata": { 
      "bookID": "book123", 
      "title": "bookTitle Here", 
      "filename": "book file name" 
     }, 
     "course": [ 
      { 
       "1": "01", 
       "2": "02" 
      }, 
      { 
       "001": "001", 
       "002": "002" 
      } 
     ], 
     "publisher": "you" 
    } 
**]** 

這可能會解決你的問題:)

+0

我試着改變deserialise語句,但是它給了我這個錯誤「」在Newtonsoft.Json.dll中發生了類型爲'Newtonsoft.Json.JsonSerializationException'的未處理異常其他信息:無法反序列化當前JSON數組(例如[1,2,3])爲類型'BookManager。 lastResponse',因爲該類型需要一個JSON對象(例如{「name」:「value」})才能正確反序列化。「」和jason從下載器返回的響應看起來就像您在第一個塊上的示例 – Red 2015-02-06 11:10:22

+0

@SthokoManqele你能分享你的JSON嗎? – 2015-02-06 11:39:09

+0

{ 「類型」: 「書」, 「元數據」:{ 「BOOKID」: 「書000f6b3e-f616-4417-b1b8-66f375e3e4b4」, 「稱號」: 「互動資產審查書」, 「文件名 「:」 交互式演示」, }, 「當然」: 「301-利布演示」 ], 「發行人」: 「ITS」, } – Red 2015-02-06 11:57:16

0

可以使用javascriptserializer

string s = "YouJsonText"; 
var serializer = new JavaScriptSerializer(); 
var result = serializer.Deserialize(s); 
//or 
YouCustomClass res = serializer.Deserialize<YouCustomClass>(sb.ToString()); 

此外,您還可以使用CustomJsonConverter這樣的:

public class YouCustomClassConverter : JavaScriptConverter 
{ 
    public override object Deserialize(IDictionary<string, object> dictionary, Type type,      JavaScriptSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 

    public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 

    //and first you need register type, which you want Deserialize 
    public override IEnumerable<Type> SupportedTypes 
    { 
     get { return new[] { typeof(YouCustomClass) }; } 
    } 

} 

//and then example of using JavaScriptSerializer with custom converter 
var ser = new JavaScriptSerializer(); 
ser.RegisterConverters(new JavaScriptConverter[] { new YouCustomClassConverter() }); 
try 
{ 
    YouCustomClass obj = ser.Deserialize(jsonString); 
} 

注意:您需要使用using System.Web.Script.Serialization;