2013-04-26 202 views
0

Guyz無法將JSON字符串反序列化爲對象

我試圖將JSON字符串解析爲對象。我有下面的實體中,我解析JSON字符串

public class Room : BaseEntity 
{ 
    public string Name { get; set; } 
    public string EmailAddress { get; set; } 
    public string RoomListEmailAddress { get; set; } 
    public string MinimumXCoordinateInMap { get; set; } 
    public string MinimumYCoordinateInMap { get; set; } 
    public string MaximumXCoordinateInMap { get; set; } 
    public string MaximumYCoordinateInMap { get; set; } 
    public string RoomCapacity { get; set; } 
    public List<RoomImage> RoomImage { get; set; } 
    public string FloorName { get; set; } 
    public string CreatedDate { get; set; } 
    public string CreatedId { get; set; } 
    public string LastUpdatedDate { get; set; } 
    public string LastUpdatedId { get; set; } 
    public InternalOnly InternalOnly { get; set; } 
    //public List<Equipment> Equipment { get; set; } 


    public override string ToString() 
    { 

     return this.Name; 
    } 
} 


public class RoomImage : BaseEntity 
    { 
     public string ImagePath { get; set; } 
     public string ImageType { get; set; } 
     public string CreatedDate { get; set; } 
     public string CreatedId { get; set; } 
     public string LastUpdatedDate { get; set; } 
     public string LastUpdatedId { get; set; } 
     public InternalOnly InternalOnly { get; set; } 
    } 
    public class InternalOnly : BaseEntity 
    { 
     public string RoomId { get; set; } 
     public string FloorId { get; set; } 
    } 
public class BaseEntity 
    { 
    } 

我使用下面的方法來解析字符串轉換成目標

public static T ParseObjectToJSON<T>(string responseText) 
    { 
     DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T)); 
     using (MemoryStream stream = new MemoryStream(Encoding.Unicode.GetBytes(responseText))) 
     { 
      var rootObject = serializer.ReadObject(stream); 
      //return Convert.ChangeType(rootObject,typeof(T),System.Globalization.CultureInfo.CurrentCulture.TextInfo); 
      return (T)rootObject; 
     } 
    } 

下面是我試圖解析

JSON字符串

https://docs.google.com/document/d/1k81M_UxIrXpHUPQNDUCHDfNw1wY7LM4mAaXjwpYMshk/edit?usp=sharing

下面的JSON字符串工作

https://docs.google.com/document/d/1uQNwMmSyEZSolyxUVJl6gXzZPr6aRAf_WAogmUvVqt4/edit?usp=sharing

在解析我得到以下錯誤

數據合同類型「GAP.Entities.Room」不能反序列化,因爲成員「RoomImage」不公開。公開成員將修復此錯誤。或者,您可以將其設置爲內部,並在程序集中使用InternalsVisibleToAttribute屬性,以啓用內部成員的序列化 - 請參閱文檔以獲取更多詳細信息。請注意,這樣做有一定的安全隱患。

注 - RoomImage在實體類中被公開標記。僅當JSON字符串包含RoomImage數組字符串時,纔會出現此錯誤,否則不會出現錯誤。

任何幫助,高度讚賞。

感謝 維諾德

+0

使用JSon.NET序列化和反序列化。看看這個網站的比較http://james.newtonking.com/projects/json-net.aspx – 2013-04-26 06:27:44

+0

請發佈'RoomImage'和'BaseEntity'的代碼。 – haim770 2013-04-26 06:34:50

回答

0

你的json的問題是,如果RoomImage有一個單一的元素,你的服務返回它作爲一個對象{}而不是一個對象數組[{}]

enter image description here

所以,如果你想在你的代碼中使用類型安全的類(因爲動態訪問也有可能),你應該預先處理你的JSON反序列化之前。下面的代碼工作(當然,大家都表示,使用Json.Net

string json = your__json__string 

//PreProcess 
var jobj = JObject.Parse(json); 
foreach (var j in jobj["ObjectList"]) 
{ 
    if (!(j["RoomImage"] is JArray)) 
    { 
     j["RoomImage"] = new JArray(j["RoomImage"]); 
    } 
} 

var obj = JsonConvert.DeserializeObject<RootObject>(jobj.ToString()); 

public class InternalOnly 
{ 
    public string RoomId { get; set; } 
    public string FloorId { get; set; } 
} 

public class RoomImage 
{ 
    public string ImagePath { get; set; } 
    public string ImageType { get; set; } 
    public string CreatedDate { get; set; } 
    public string CreatedId { get; set; } 
    public string LastUpdateDate { get; set; } 
    public string LastUpdateId { get; set; } 
} 

public class ObjectList 
{ 
    public string Name { get; set; } 
    public string EmailAddress { get; set; } 
    public string RoomListEmailAddress { get; set; } 
    public string MinimumXCoordinateInMap { get; set; } 
    public string MinimumYCoordinateInMap { get; set; } 
    public string MaximumXCoordinateInMap { get; set; } 
    public string MaximumYCoordinateInMap { get; set; } 
    public string RoomCapacity { get; set; } 
    public RoomImage[] RoomImage { get; set; } 
    public string FloorName { get; set; } 
    public string CreatedDate { get; set; } 
    public string CreatedId { get; set; } 
    public string LastUpdatedDate { get; set; } 
    public string LastUpdatedId { get; set; } 
    public string IsRestrictedRoom { get; set; } 
    public InternalOnly InternalOnly { get; set; } 
    public object Equipment { get; set; } 
} 

public class RootObject 
{ 
    public List<ObjectList> ObjectList { get; set; } 
} 
1

您可以download和反序列化使用Newtonsoft的JSON。

你必須參考以下的DLL,之後,你可以試試這個:

List<Room> deserializedObj = (List<Room>)Newtonsoft.Json.JsonConvert.DeserializeObject(responseText, typeof(List<Room>)); 
+0

它不適合我,因爲我在便攜式庫中使用它。我想盡可能使用相同的機制 – vinod8812 2013-04-26 06:43:49

+0

你可以發佈你的Json字符串嗎? – lexeRoy 2013-04-26 06:52:33

+0

也發佈了JSON字符串 – vinod8812 2013-04-26 07:05:30

0

酒店RoomImage是公開的,但你的類可能不是。

確保RoomImage類也標記爲公共。這應該可以解決問題。

或者使用像JSON.NET這樣的庫,可以在不需要公共類的情況下進行反序列化。

+0

RoomImage類也是公開的... – vinod8812 2013-04-26 06:39:37

+0

請發佈RoomImage和BaseEntity的代碼。 – Kenneth 2013-04-26 06:40:43

+0

我發佈了RoomImage和BaseEntity以及 – vinod8812 2013-04-26 06:43:18

相關問題