繁体   English   中英

无法将JSON字符串反序列化为对象

[英]Unable to deserialize the JSON string to object

盖兹

我正在尝试将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数组字符串时出现此错误,否则不会出错。

非常感谢您的帮助。

感谢Vinod

您可以使用Newtonsoft 下载并反序列化JSON。

您必须引用以下DLL,然后您可以尝试以下操作:

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

RoomImage属性是公共的,但您的课程可能不是。

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

另外,也可以使用类似JSON.NET的库,而无需使用公共类就可以进行反序列化。

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; }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM