我已经创建了一个在我的API上执行某些请求的dll。现在请求发送给我一个json响应,我想要做的(从dll),返回一个对象数组,用于实现DLL的程序。现在我上了这堂课:
public class Details
{
public string name { get; set; }
public string age { get; set; }
}
public class Info
{
public List<object> info { get; set; }
}
public class User
{
public Details details { get; set; }
public Info info { get; set; }
}
public class RootObject
{
public User user { get; set; }
}
我将请求反序列化为:
var obj = JsonConvert.DeserializeObject<List<RootObject>>("json returned");
现在json包含用户的details
,在某些情况下还包含info
,所以我以这种方式迭代它:
foreach(var user in obj)
{
item.user.details.name;
//take some info (could not contain nothing)
foreach(var info in user.info.info)
{
info; //<- contains all the information
}
}
我想知道的是:如何创建对象列表?特别是我想要发回user
具有属性details
和info
的对象。结果应该是一个对象数组,因为对象需要迭代它并将每个对象属性读取为:
user[0].details.name: //where 0 is the index of the user (php syntax)
我不知道c#中是否有可能,有人可以帮我实现这个目标吗?
答案 0 :(得分:3)
您的json转换器返回List<RootObject>
,每个RootObject
只包含一个属性:user。简单的Linq查询会将List<RootObject>
更改为List<User>
对象:
var users = obj.Select(o => o.user).ToList();
users
中的每个元素都是User
,同时包含Details
和Info
属性。
作为如何使用它的示例,请考虑您有一个从json进行转换的方法,并且您希望该方法返回用户列表。该方法看起来像这样:
public List<User> GetUsersFromJson()
{
var obj = JsonConvert.DeserializeObject<List<RootObject>>("json returned");
var users = obj.Select(o => o.user).ToList();
return users;
}
您可以像这样迭代用户对象:
foreach (var user in users)
{
var detail = user.details;
var info = user.info;
}
您应该考虑将公共属性更改为camel-case,这是C#中常见的做法。
答案 1 :(得分:1)
JsonConvert.DeserializeObject&GT;返回RootObject列表。您可以使用方法ToArray()将列表更改为数组。
在这种情况下:
var obj = JsonConvert.DeserializeObject<List<RootObject>>("json returned");
RootObject[] array = obj.ToArray();
string s = array[0].user.details.name;
object[] infos = array[0].user.info.info.ToArray();
并在此代码中:
foreach(var user in obj)
{
item.user.details.name;
//take some info (could not contain nothing)
foreach(var info in user.info.info)
{
info; //<- contains all the information
}
}
没有感觉,它应该是这样的:
foreach (RootObject elem in obj)
{
foreach (Info info in elem.user.info.info)
{
object[] localInfo = info.info.ToArray(); //<- contains all the information
}
}