【问题标题】:Deserializing JSON result with Json & JavaScriptSerializer使用 Json 和 JavaScriptSerializer 反序列化 JSON 结果
【发布时间】:2011-04-30 01:17:40
【问题描述】:

这是我的问题:

我正在尝试反序列化我尚未完成的 json。 json的格式如下:

{"responseId":1200,
"availableHotels":[
    {"processId":"HA-84665605","hotelCode":"UKKTLT","availabilityStatus":"InstantConfirmation",...},
    {"processId":"HA-28600965","hotelCode":"UKKTLT","availabilityStatus":"InstantConfirmation",...},
    {"processId":"HI-63991185","hotelCode":"UKJOVF","availabilityStatus":"InstantConfirmation",...}
],
"totalFound":9,
"searchId":"TP-84026455"}

还有以下类:

  • getAvailableHotelResponse w/属性:
    • hotelObj availableHotels
    • int totalFound
    • 字符串 responseId
    • 字符串搜索ID
  • hotelObj 带属性:
    • 酒店酒店
  • 酒店带属性:
    • 进程 ID
    • 酒店代码
    • 可用性状态
    • ...

因此,我知道从 json 中可以看出它包含 getAvailableHotelResponse 对象的信息。

所以,我使用JsonConvert 和JavaScriptSerializer 尝试了以下操作:

JavaScriptSerializer ser = new JavaScriptSerializer();
getAvailableHotelResponse availableResponse = ser.Deserialize<getAvailableHotelResponse>(json);
// Exception: "Type 'com.hotelspro.api.getAvailableHotelResponse' is not supported for deserialization of an array"

List<getAvailableHotelResponse> items = ser.Deserialize<List<getAvailableHotelResponse>>(json);
// items.Count = 0

List<getAvailableHotelResponse> result = JsonConvert.DeserializeObject<List<getAvailableHotelResponse>>(json);
// Exception: "Cannot deserialize JSON object into type 'System.Collections.Generic.List`1[com.hotelspro.api.getAvailableHotelResponse]'."

getAvailableHotelResponse result2 = JsonConvert.DeserializeObject<getAvailableHotelResponse>(json);
// Exception: Cannot deserialize JSON array into type 'com.hotelspro.api.hotelObj'.

为了反序列化这个对象,正确的句子是什么?

谢谢!

【问题讨论】:

    标签: c# .net json json.net javascriptserializer


    【解决方案1】:

    很难根据您的描述来解释对象的结构,但我能够使用以下最少的代码反序列化您的示例 JSON:

    var result = JsonConvert.DeserializeObject<getAvailableHotelResponse>(json);
    
    public class getAvailableHotelResponse
    {
        public int responseId;
        public availableHotel[] availableHotels;
        public int totalFound;
        public string searchId;
    }
    
    public class availableHotel
    {
        public string processId;
        public string hotelCode;
        public string availabilityStatus;
    }
    

    【讨论】:

    • 我在发布我的回复后阅读了您的回复 :) 抱歉复制了它。但是您没有考虑到酒店匹配的...部分,我认为是酒店类型
    • 谢谢内森!这正是我所需要的!
    【解决方案2】:

    上面列出的对象都没有完全匹配 JSON 模式...您确定将对象序列化为 JSON 的人使用了您尝试反序列化的任何类吗?如果没有,只需创建一个将 JSON 反序列化为的类:

    public class HotelSearchResponse
    {
        public int responseID {get;set;}
        public hotel[] availableHotels {get;set;}
        public int totalFound {get;set;}
        public string searchId {get;set;}
    }
    

    如果hotel 数组不起作用,请尝试使用List&lt;hotel&gt; 代替availableHotels 类型。

    附:从您的问题中列出的对象中,与 JSON 最接近的对象是 getAvailableHotelResponse,但它将 availableHotels 声明为单个 hotel 实例,而不是 JSON 返回了一个 hotel 对象数组。

    【讨论】:

    • 谢谢迪米特里!你的回答和内森所说的正是我所需要的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多