使用子数组的Json反序列化不包含值

时间:2015-01-08 20:44:28

标签: c# multidimensional-array json.net

我正在尝试反序列化一个json对象。问题是该对象还包含子数组 http://i.imgur.com/WWwEVLR.png

除了子阵列外,一切正常。

我正在使用Newtonsoft.Json;

这是我的班级

    public string date_updated { get; set; }
    public string date_expires { get; set; }

这很好。

对于子阵列,我这样做了:

    public JsonArray contacts { get; set; }

这是我反序列化的方法:

            var json = await webClient.GetAsync(new Uri(uri));
            var result = await json.Content.ReadAsStringAsync();
            Model = JsonConvert.DeserializeObject<Model>(result); 

使用所有需要的字段创建数组,但值不起作用。 这些值只是:Windows.Json.JsonObject,如下图所示。

http://i.imgur.com/Q8bpCoD.png

他为什么不写价值观?我怎么能得到它们?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

定义新类

class Contact {
    public string type { get; set; }
    public string name { get; set; }
    // etc
}

并修改您的ReqInfo_WhoIs_Model班级

public string date_updated { get; set; }
public string date_expires { get; set; }
public List<Contact> contacts { get; set; }

答案 1 :(得分:1)

价值观正常。使用JsonArray告诉反序列化器将JSON数据转换为与JsonArray类型兼容的东西。此类型只是下面的JSON字符串的1:1表示形式,不会自动反序列化为有用的数据。

此外,JsonArray甚至不是Json.Net库的一部分。正如调试器告诉你的那样,它是Windows.Data.Json命名空间的一部分,它位于不同的库中。您仍然可以使用类中的各种Get方法(http://msdn.microsoft.com/en-us/library/windows.data.json.jsonobject.aspx)直接从每个JsonObjects访问数据,但这可能不是您想要的方式。

在您的情况下,您应该创建一个表示每个阵列中的数据的类。如果并非数组中的所有条目都包含您班级的所有属性,请不要担心。反序列化时,Json.Net只会将其值保留为空。这看起来像是:

public class Contact
{
    public string type { get; set; }
    public string name { get; set; }
    public string organization { get; set; }
    public string full_address { get; set; }

    etc.
}

为了更好地衡量,您还应该遵守C#命名约定,该约定规定属性应使用CamelCase名称。为了帮助您,您可以像这样使用JsonProperty属性:

public class Contact
{
    [JsonProperty("type")]
    public string Type { get; set; }

    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("organization")]
    public string Organization { get; set; }

    [JsonProperty("full_address")]
    public string FullAddress { get; set; }

    etc.
}

然后,您可以将contacts属性的类型替换为List<Contact>,数据将自动反序列化为您可以轻松使用的格式。