C# 将 JSON 转换为多个类

4

我有一个问题。我正在尝试将我的JSON解析成2个类。这是JSON:

{
   "user":[
      [
         {
            "Id":"0",
            "Username":"Vreeswijk",
            "ProfilePicture":"media/user/0.png"
         }
      ]
   ],
   "token":[
      [
         {
            "access_token":"myToken1",
            "refresh_token":"myToken2",
            "expires_in":3600,
            "expires_on":1577363756
         }
      ]
   ]
}

以下是我的两个类:

public class Token
{
    public string access_token { get; set; }
    public string refresh_token { get; set; }
    public int expire_in { get; set; }
    public int expire_on { get; set; }

    public Token() { }
}

这里是用户类:

public class User
{
    [PrimaryKey]
    public int Id { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }
    public string ProfilePicture { get; set; }

    public User() { }
    public User(string Username, string Password)
    {
        this.Username = Username;
        this.Password = Password;
    }
}

现在我想将JSON反序列化为这两个类。以下是目前仅适用于1个类的代码:

var jObject = JObject.Parse(json);
var userPropery = jObject["user"] as JArray;
userList= new List<user>();

foreach (var property in userPropery )
{
    var propertyList = JsonConvert.DeserializeObject<List<user>>(property.ToString());

    userList.AddRange(propertyList);
}

如何将此方法应用到一个包含2个类别的JSON数据中?

3个回答

1
你可以创建一个 Root 类来处理你的 json 数据,并根据需要在其中添加两个属性,分别是 UserToken 类。
public class Root
{
    public List<List<User>> Users { get; set; }
    public List<List<Token>> Tokens { get; set; }
}

然后将这个类传递给DeserializeObject函数以反序列化json。


好的,但我不需要使用List<>,因为我总是只获取一个元素。但是我该怎么处理这一行代码:var userPropery = jObject["user"] as JArray;...现在我两个都需要吗? - A. Vreeswijk
你尝试过使用 var tokenPropery = jObject["token"] as JArray; 在你现有的代码中进行反序列化吗? - stud3nt

1
如果您观察您的Json,用户和令牌都是嵌套数组。您现在可以创建一个具有所需属性的根类。例如:
public class Root
{
    public List<List<User>> user { get; set; }
    public List<List<Token>> token { get; set; }
}

现在,您可以直接将其反序列化而不是使用JObject.Parse
var root = JsonConvert.DeserializeObject<Root>(json);

为了获取扁平化的用户和令牌列表,您可以使用:
var userList= root.user.SelectMany(x=>x); 
var tokenList= root.token.SelectMany(x=>x); 

当我直接将JSON放入反序列化器中时,会出现以下错误:Newtonsoft.Json.JsonSerializationException: '无法将当前JSON数组(例如[1,2,3])反序列化为类型'MyApp.Models.User',因为该类型需要一个JSON对象(例如{"name":"value"})才能正确反序列化。 - A. Vreeswijk
希望您直接使用了Json字符串,而不是在将其解析为JObject后仅使用其中的一部分? - Anu Viswan
我没有将任何内容解析为jobject。我提供了从页面获取的结果。 - A. Vreeswijk

0
为什么不创建一个包含usertoken的类呢? 如果你不这样做,请逐个解析。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接