【发布时间】:2013-03-16 21:10:41
【问题描述】:
作为来自 Bitbucket REST API 的响应,我得到以下 JSON 对象(简化版):
{
"repositories": [
{
"scm": "hg",
"has_wiki": false,
"language": "c#",
"slug": "Repo1"
},
{
"scm": "hg",
"has_wiki": false,
"language": "java",
"slug": "Repo2"
},
{
"scm": "hg",
"has_wiki": true,
"language": "c#",
"slug": "Repo3"
}
],
"user": {
"username": "someuser",
"first_name": "Some",
"last_name": "User",
"display_name": "Some User",
"is_team": false,
"avatar": "https://someuseravatar.com",
"resource_uri": "/1.0/users/someuser"
}
}
我需要反序列化的这个 JSON 对象的唯一部分是 user 部分。为此,我创建了以下类:
[DataContract(Name="user")]
public class BitbucketUser
{
[DataMember(Name = "username")]
public string Username { get; set; }
[DataMember(Name = "first_name")]
public string FirstName { get; set; }
[DataMember(Name = "last_name")]
public string LastName { get; set; }
[DataMember(Name = "display_name")]
public string DisplayName { get; set; }
[DataMember(Name = "is_team")]
public bool IsTeam { get; set; }
[DataMember(Name = "avatar")]
public string Avatar { get; set; }
[DataMember(Name = "resource_uri")]
public string ResourceUri { get; set; }
}
还有一个反序列化json的辅助方法:
public static T Deserialize<T>(string json)
{
DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(T));
using (MemoryStream stream = new MemoryStream(Encoding.Unicode.GetBytes(json)))
{
T result = (T)deserializer.ReadObject(stream);
return result;
}
}
所以,当我尝试使用以下代码反序列化 User 对象时:
User user = JsonHelper.Deserialize<User>(jsonResponse);
然后我得到 user 创建的对象,其中包含 null 的所有属性。我试图找到在类头上使用的正确属性,但结果是一样的。而且我没有使用 Json.NET 库只是为了避免额外的库引用,也没有创建包装类来将该用户对象作为User 类型的属性并将存储库对象作为存储库的数组[ ] 类型。
是否有解决此问题的方法来获取没有空字段的反序列化用户对象?
【问题讨论】:
-
“我没有使用 Json.NET 库只是为了避免额外的库引用” 库引用真的需要避免吗?甚至微软现在也通过 NuGet 分发它的一些库。
-
newtonsoft.com/json/help/html/SerializingJSONFragments.htm 这是使用 newtonsoft.json 的方法(首先在谷歌上得到了这个问题,所以它可能对其他人有用)
标签: c# json deserialization datacontractserializer datacontractjsonserializer