2013-04-26 95 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

相关问题