Json 子数组的反序列化不包含值
Json Deserialisation with subarrays doesn't contain values
我正在尝试反序列化 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
他为什么不写值?我怎样才能得到它们?
感谢您的帮助。
定义新的class
class Contact {
public string type { get; set; }
public string name { get; set; }
// etc
}
并修改你的ReqInfo_WhoIs_Model
class
public string date_updated { get; set; }
public string date_expires { get; set; }
public List<Contact> contacts { get; set; }
这些值工作正常。使用 JsonArray 告诉反序列化器将 JSON 数据转换为与 JsonArray 类型兼容的数据。此类型只是下方 JSON 字符串的 1:1 表示,不会自动为您反序列化为有用的数据。
此外,JsonArray 甚至不是 Json.Net 库的一部分。正如调试器告诉您的那样,它是 Windows.Data.Json 名称空间的一部分,该名称空间位于不同的库中。您仍然可以使用 class ( http://msdn.microsoft.com/en-us/library/windows.data.json.jsonobject.aspx ) 中的各种 Get 方法直接从每个 JsonObjects 访问数据,但这可能不是您想要的方式。
在您的情况下,您应该创建一个 class 来代表每个数组中的数据。如果不是数组中的所有条目都包含 class 的所有属性,请不要担心。 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>
,数据将自动反序列化为您可以轻松使用的格式。
我正在尝试反序列化 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
他为什么不写值?我怎样才能得到它们?
感谢您的帮助。
定义新的class
class Contact {
public string type { get; set; }
public string name { get; set; }
// etc
}
并修改你的ReqInfo_WhoIs_Model
class
public string date_updated { get; set; }
public string date_expires { get; set; }
public List<Contact> contacts { get; set; }
这些值工作正常。使用 JsonArray 告诉反序列化器将 JSON 数据转换为与 JsonArray 类型兼容的数据。此类型只是下方 JSON 字符串的 1:1 表示,不会自动为您反序列化为有用的数据。
此外,JsonArray 甚至不是 Json.Net 库的一部分。正如调试器告诉您的那样,它是 Windows.Data.Json 名称空间的一部分,该名称空间位于不同的库中。您仍然可以使用 class ( http://msdn.microsoft.com/en-us/library/windows.data.json.jsonobject.aspx ) 中的各种 Get 方法直接从每个 JsonObjects 访问数据,但这可能不是您想要的方式。
在您的情况下,您应该创建一个 class 来代表每个数组中的数据。如果不是数组中的所有条目都包含 class 的所有属性,请不要担心。 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>
,数据将自动反序列化为您可以轻松使用的格式。