【问题标题】:C# Convert json to multiple classesC# 将 json 转换为多个类
【发布时间】:2019-12-26 12:02:29
【问题描述】:

我有问题。我正在尝试将我的 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);
}

我怎样才能使 1 个 json 中的 2 个类起作用?

【问题讨论】:

    标签: c# json parsing serialization


    【解决方案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 直接放入 Deserializer 中时,出现此错误:Newtonsoft.Json.JsonSerializationException: 'Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'MyApp.Models.User' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly.
    • 希望你直接使用了Json字符串,而不是解析为JObject之后的一部分?
    • 我没有将任何内容解析为作业。我提供了从页面获得的结果
    【解决方案2】:

    您可以为您的 json 创建一个 Root 类,并根据需要在其中添加两个属性:UserToken 类。

    public class Root
    {
        public List<List<User>> Users { get; set; }
        public List<List<Token>> Tokens { get; set; }
    }
    

    然后在DeserializeObject函数中传入这个类来反序列化json。

    【讨论】:

    • 好的,但我不需要使用 List 因为我总是得到 1 个元素。但是我需要用这条线做什么:var userPropery = jObject["user"] as JArray;.....我现在都需要它们?
    • 您是否尝试过使用var tokenPropery = jObject["token"] as JArray; 使用您现有的代码进行反序列化?
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-10
      相关资源
      最近更新 更多