簡體   English   中英

System.Text.Json.JsonException:無法將 JSON 值轉換為 Entities.UserCard。 路徑:$[0].Cards

[英]System.Text.Json.JsonException: The JSON value could not be converted to Entities.UserCard. Path: $[0].Cards

這是我的程序 class 遷移將要開始的地方

public class Program
{
    public static async Task Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();
        using var scope = host.Services.CreateScope();
        var services = scope.ServiceProvider;
        try{
            var context = services.GetRequiredService<DataContext>();
            await context.Database.MigrateAsync();
            await Seed.SeedUsers(context);
        }catch(Exception ex){
            var logger = services.GetRequiredService<ILogger<Program>>();
            logger.LogError(ex,"An error occurred during migration");
        }

        await host.RunAsync();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

這是我的主 class

public class AppUser
{
    public int Id { get; set; }
    [StringLength(20)]

    public string UserName { get; set; }

    public byte[] PasswordHash { get; set; }

    public byte[] PasswordSalt { get; set; }

    public DateTime DateOfBirth { get; set; }

    public DateTime Created { get; set; }=DateTime.Now;

    public DateTime LastActive { get; set; }=DateTime.Now;

    public string Gender { get; set; }
    public string City { get; set; }
    public string Country { get; set; }

    public ICollection<Photo> Photos { get; set; }

    public UserCard Cards { get; set; }

    public int GetAge(){
        return DateOfBirth.CalculateAge();
    }
}

這是我想與數據庫中的 AppUser 鏈接的 UserCard

[Table("Cards")]
public class UserCard
{
     public int Id { get; set; }
    public string Code { get; set; }
    public string Status { get; set; }
    public string Type { get; set; }

    public AppUser AppUser{ get; set; }
    public int AppUserId { get; set; }
}

這是我的種子 function 的樣子

public class Seed
{
    public static async Task SeedUsers(DataContext context){
        if(await context.Users.AnyAsync()) return;

        var userData=await System.IO.File.ReadAllTextAsync("Data/UserSeedData.json");
        var users=JsonSerializer.Deserialize<List<AppUser>>(userData);
        foreach (var user in users)
        {
            using var hmac=new HMACSHA512();
            user.UserName = user.UserName.ToLower();
            user.PasswordHash=hmac.ComputeHash(Encoding.UTF8.GetBytes("admin"));
            user.PasswordSalt=hmac.Key;
            context.Users.Add(user);
        }

        await context.SaveChangesAsync();
    }

這是我想放入數據庫的數據。這里我還有另一張 class 照片,這就是它在那里的原因

[
{
    "UserName": "Tami",
    "Gender": "female",
    "DateOfBirth": "1995-09-28",
    "Created": "2020-05-01",
    "LastActive": "2020-05-29",
    "City": "Haring",
    "Country": "San Marino",
    "Photos": [
        {
            "Url": "https://randomuser.me/api/portraits/women/94.jpg",
            "IsMain": true
        }
    ],
    "Cards": [
        {
            "Code": "123123543",
            "Status": "notActive",
            "Type": "default"
        }
    ]
}
]

當我輸入:do.net watch run 我的數據庫將使用正確的鏈接正確創建表但是當種子發生時我得到這個錯誤

  fail: API.Program[0]
  An error occurred during migration
  System.Text.Json.JsonException: The JSON value could not be converted to Entities.UserCard. Path: $[0].Cards | LineNumber: 15 | BytePositionInLine: 18.
     at System.Text.Json.ThrowHelper.ThrowJsonException_DeserializeUnableToConvertValue(Type propertyType)
     at System.Text.Json.Serialization.Converters.ObjectDefaultConverter`1.OnTryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value)
     at System.Text.Json.Serialization.JsonConverter`1.TryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value)
     at System.Text.Json.Serialization.Metadata.JsonPropertyInfo`1.ReadJsonAndSetMember(Object obj, ReadStack& state, Utf8JsonReader& reader)
     at System.Text.Json.Serialization.Converters.ObjectDefaultConverter`1.OnTryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value)
     at System.Text.Json.Serialization.JsonConverter`1.TryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value)
     at System.Text.Json.Serialization.JsonCollectionConverter`2.OnTryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, TCollection& value)
     at System.Text.Json.Serialization.JsonConverter`1.TryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value)
     at System.Text.Json.Serialization.JsonConverter`1.ReadCore(Utf8JsonReader& reader, JsonSerializerOptions options, ReadStack& state)
     at System.Text.Json.JsonSerializer.ReadFromSpan[TValue](ReadOnlySpan`1 utf8Json, JsonTypeInfo jsonTypeInfo, Nullable`1 actualByteCount)
     at System.Text.Json.JsonSerializer.ReadFromSpan[TValue](ReadOnlySpan`1 json, JsonTypeInfo jsonTypeInfo)
     at System.Text.Json.JsonSerializer.Deserialize[TValue](String json, JsonSerializerOptions options)
     at API.Data.Seed.SeedUsers(DataContext context) in C:\Users\Alejandro\Desktop\ProjectApp\API\Data\Seed.cs:line 19
     at API.Program.Main(String[] args) in C:\Users\Alejandro\Desktop\ProjectApp\API\Program.cs:line 24

我發現了問題

  public ICollection<Photo> Photos { get; set; }
    public UserCard Cards { get; set; }

我只需要將 ICollection 放到 Cards 道具上,但我需要幫助來解決這個問題。現在使用 ICollection 的關系是一對多的,但是對於卡片我希望關系是 1 到 1 在這種情況下我需要做什么?

對於 1 對 1 關系,您可以像這樣更改 json 結構;

[
{
    ...
    "Cards": {
            "Code": "123123543",
            "Status": "notActive",
            "Type": "default"
        }
    ...

}
]

請注意, Cards屬性現在是一個 object,而不是一個數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM