0

盖兹

我正在尝试将 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/1uQNwMmSyEZSolyxUVJl6gXzZZPr6aRAf_WAogmUvVqt4/edit?usp=sharing

解析时出现以下错误

无法反序列化数据合同类型“GAP.Entities.Room”,因为成员“RoomImage”不是公共的。将成员设为公开将修复此错误。或者,您可以将其设为内部,并在程序集上使用 InternalsVisibleToAttribute 属性以启用内部成员的序列化 - 有关更多详细信息,请参阅文档。请注意,这样做有一定的安全隐患。

注意 - RoomImage 在实体类中被标记为公共。仅当 JSON 字符串包含 RoomImage 数组字符串时才会出现此错误,否则不会出错。

非常感谢任何帮助。

谢谢维诺德

4

3 回答 3

1

您可以使用Newtonsoft.

你必须引用下面的DLL,然后你可以试试这个:

List<Room> deserializedObj = (List<Room>)Newtonsoft.Json.JsonConvert.DeserializeObject(responseText, typeof(List<Room>));
于 2013-04-26T06:32:23.263 回答
0

您的 json 的问题在于,如果 RoomImage 有一个元素,您的服务会将其作为对象返回,而{}不是作为对象数组返回[{}]

在此处输入图像描述

所以如果你想在你的代码中使用类型安全的类(因为动态访问也是可能的)你应该在反序列化之前预处理你的 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; }
}
于 2013-04-26T08:20:18.623 回答
0

属性 RoomImage 是公开的,但您的班级可能不是。

确保 RoomImage 类也被标记为 public。那应该可以解决问题。

或者使用像 JSON.NET 这样的库,它可以在不需要公共类的情况下进行这种反序列化。

于 2013-04-26T06:37:39.630 回答