JSONConvert.DeserializeObject not handling child array with unnamed array items

本小妞迷上赌 提交于 2019-12-11 08:36:33

问题


I have the following JSON object coming to me from a web service

{
   "room":{
      "name":"Thunderdome",
      "created_at":"2012/04/15 00:36:27 +0000",
      "id":xxxxxxx,
      "users":[
         {
            "type":"Member",
            "avatar_url":"url",
            "created_at":"2012/02/27 14:11:57 +0000",
            "id":1139474,
            "email_address":"xxx@xxxxxxx.com",
            "admin":false,
            "name":"xxxx xxxxx"
         },
         {
            "type":"Member",

etc

I'm using the following line to deserialize:

var room = JsonConvert.DeserializeObject<SingleRoom>(text);

And the following mapping classes

public class SingleRoom
{
    public Room Room { get; set; }
}

[DataContract]
public class Room
{
    [DataMember]
    public int Id { get; set; }
    [DataMember]
    public string Name { get; set; }
    public string Image {
        get { return "Assets/campfire.png"; }
    }
    [DataMember]
    public string Topic { get; set; }
    [DataMember(Name ="membership_limit")]
    public int MembershipLimit { get; set; }
    [DataMember]
    public bool Full { get; set; }
    [DataMember]
    public bool Locked { get; set; }
    [DataMember(Name = "open_to_guests")]
    public bool OpenToGuests { get; set; }
    [DataMember(Name = "updated_at")]
    public DateTime UpdatedAt { get; set; }
    [DataMember(Name = "created_at")]
    public DateTime CreatedAt { get; set; }

    [DataMember(Name = "active_token_value")]
    public string ActiveTokenValue { get; set; }

     [DataMember(Name = "Users")]
    public List<User> Users { get; set; } 
}

[DataContract]
public class User
{
    [DataMember]
    public int Id { get; set; }
    [DataMember]
    public string Name { get; set; }

    [DataMember(Name = "email_address")]
    public string EmailAddress { get; set; }
    [DataMember]
    public bool Admin { get; set; }
    [DataMember]
    public DateTime CreatedAt { get; set; }
    [DataMember]
    public string Type { get; set; }

    [DataMember(Name = "avatar_url")]
    public string AvatarUrl { get; set; }
}

The 'Room' object deserializes correctly but the Users property on the Room is always null. I know that a null result is the result of a JSON.NET serialization that couldn't find the matching property. However, I think I have it right? List should match to user. I know the array object users in the JSON doesn't have named children, is that the issue? If so, how do I solve it?

Thanks!


回答1:


This works.... You can rename them (or use JsonProperty attribute) to use c# style property names

(BTW: Json.Net doesn't require DataMember, DataContract attributes)

var obj = JsonConvert.DeserializeObject<SingleRoom>(json)

public class User
{
    public string type { get; set; }
    public string avatar_url { get; set; }
    public string email_address { get; set; }
    public bool admin { get; set; }
    public string name { get; set; }
    public string created_at { get; set; }
    public int id { get; set; }
}

public class Room
{
    public string topic { get; set; }
    public int membership_limit { get; set; }
    public bool locked { get; set; }
    public string name { get; set; }
    public List<User> users { get; set; }
    public bool full { get; set; }
    public bool open_to_guests { get; set; }
    public string updated_at { get; set; }
    public string created_at { get; set; }
    public int id { get; set; }
}

public class SingleRoom
{
    public Room room { get; set; }
}

PS: You may find that site useful http://json2csharp.com/ .



来源:https://stackoverflow.com/questions/20499701/jsonconvert-deserializeobject-not-handling-child-array-with-unnamed-array-items

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!