我需要反序列化一个json,所以我创建了这个类结构:
public class Detail
{
public string code { get; set; }
public string type { get; set; }
}
public class User
{
public string name { get; set; }
public string surname { get; set; }
public string lastname { get; set; }
}
public class Tenant
{
public List<User> user { get; set; }
public List<Detail> detail { get; set; }
}
public class RootObject
{
public Tenant tenant { get; set; }
}
现在我需要返回一个包含User
和Detail
的对象。特别是,我希望向用户发送一个允许访问obj.Tenant.User
和obj.Tenant.Detail
的对象。这是我发回数据的方法:
public List<Tenant> searchUser()
{
var obj = JsonConvert.DeserializeObject<RootObject>("json");
return obj.tenant; //?
}
Tenant
对象包含课程user
和detail
。现在,user是用户列表,详细信息包含每个用户的详细信息列表。但不幸的是我收到了这条错误消息:
Can not be converted implicitly the 'User.Tenant' type 'System.Collections.Generic.List <User.Tenant>' Tenant
就在这一行:return obj.tenant;
我想我错了发回数据的类型。但我该如何解决这个问题呢?
答案 0 :(得分:3)
取决于你真正需要的。
如果您需要返回租户对象,请更改您的方法签名/返回此...
public Tenant getTenant()
{
var obj = JsonConvert.DeserializeObject<RootObject>("json");
return obj.tenant;
}
如果您需要用户,请更改您的方法签名/返回此...
public List<User> getUsers()
{
var obj = JsonConvert.DeserializeObject<RootObject>("json");
return obj.tenant.user; //?
}
但是,我建议更改您的属性名称以获得正确的上部外壳。如果你要返回一个User对象列表,那么将该属性称为Users而不是user是有意义的。考虑一下您的数据模型,每个链接是一对一还是一对多等,以及相应的代码/名称。
MS命名建议(https://msdn.microsoft.com/en-us/library/ms229012.aspx)。
答案 1 :(得分:2)
问题是,您的方法签名表明您将返回List<Tenant>
,而您的返回类型明确表示它是单Tenant
:
public List<Tenant> searchUser() { var obj = JsonConvert.DeserializeObject<RootObject>("json"); return obj.tenant; //Type is Tenant (according to RootObject) }
两个中的一个(或两个)都是假的。如果一个是假的,有两个选择:
因此,您应该将返回类型更改为Tenant
:
public Tenant searchUser() { var obj = JsonConvert.DeserializeObject<RootObject>("json"); return obj.tenant; //Type is Tenant (according to RootObject) }
否则您必须更改RootObject
的{{1}}类型:
public class RootObject { public List<Tenant> tenant { get; set; } }
根据您的JSON file,这是第一个选项(1。)。
然后,您可以使用tenant
的结果访问User
和Detail
:类似于:
searchUser