第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何創(chuàng)建 C# 類以反序列化以方括號(hào)開頭和結(jié)尾的 JSON 字符串

如何創(chuàng)建 C# 類以反序列化以方括號(hào)開頭和結(jié)尾的 JSON 字符串

C#
Qyouu 2022-12-31 09:41:12
我從 API 收到一個(gè) JSON 字符串,想將其反序列化為 C# 對(duì)象,但無(wú)法正確獲取類。我嘗試使用http://json2csharp.com/創(chuàng)建類,但它無(wú)法解析 JSON,但是https://jsonlint.com/表示 JSON 有效。我也試過(guò)運(yùn)行JsonClassGeneratorLib但那說(shuō)無(wú)法將 Newtonsoft.Json.Linq.JValue 類型的對(duì)象轉(zhuǎn)換為 Newtonsoft.Json.Linq.JObject這似乎是一個(gè)問(wèn)題,因?yàn)?JSON 包含在[]方括號(hào)中。我相信這是有效的,但將其放入數(shù)組中。我想我需要在課堂上的某個(gè)地方使用一個(gè)數(shù)組。您可能需要使用顯式映射來(lái)實(shí)現(xiàn)此目的:在您的上下文的 OnModelCreating() 中:modelBuilder.Entity<User>()   .HasOptional(u => u.Promotion)   .WithRequired(p => p.Pilote)   .Map(u => u.MapKey("PiloteId"); // EF6   // .HasForeignKey("PilotId") // EF Core這假設(shè)用戶可能有促銷活動(dòng),也可能沒(méi)有促銷活動(dòng),但所有促銷活動(dòng)都有試點(diǎn)。Promotion.Users 可能會(huì)按照慣例在促銷表上使用 UserId 進(jìn)行映射,但如果存在任何問(wèn)題:但是,這種方法有一個(gè)很大的警告,它與模式有關(guān),而不是 EF。沒(méi)有任何限制/保護(hù)措施可以確保飛行員是與促銷相關(guān)的用戶之一。PiloteId 可以指向任何用戶,并且該用戶的 promotionId 可能不同。在任何情況下,管理誰(shuí)是飛行員的邏輯都需要通過(guò)代碼來(lái)完成,但這意味著要么檢查有效組合的 ID,要么像這樣:如果一個(gè)用戶只能與 1 個(gè)促銷相關(guān)聯(lián),并且該促銷中的一個(gè)用戶可以是試點(diǎn),那么您可以考慮向用戶添加一個(gè)名為“IsPilot”的標(biāo)志。然后在促銷中:public virtual ICollection<User> Users { get; set; } = new List<User>();[NotMapped]public User Pilote{   get { return Users.SingleOrDefault(u => u.IsPilote); }   set    {         var newPilote = Users.Single(u => u.UserId == value.UserId); // Ensure the user nominated for Pilote is associated with this Promotion.      var existingPilote = Pilote;      if (existingPilote != null)          existingPilote.IsPilote = false;      newPilote.IsPilote = true;   }}string Json = @"[""error"",{""code"":2,""msg"":""This API Key is invalid""}]";var obj = JsonConvert.DeserializeObject<RootObject>(Json);public class CodeMsg{    [JsonProperty("code")]    public long Code { get; set; }    [JsonProperty("msg")]    public string Msg { get; set; }}我總是得到錯(cuò)誤無(wú)法將當(dāng)前 JSON 數(shù)組(例如 [1,2,3])反序列化為類型“ConsoleApp1.RootObject”,因?yàn)樵擃愋托枰?JSON 對(duì)象(例如 {"name":"value"})才能正確反序列化。要修復(fù)此錯(cuò)誤,要么將 JSON 更改為 JSON 對(duì)象(例如 {"name":"value"}),要么將反序列化類型更改為數(shù)組或?qū)崿F(xiàn)集合接口的類型(例如 ICollection、IList),就像List<T>這樣從 JSON 數(shù)組反序列化如果可以將用戶分配給多個(gè)促銷活動(dòng),那么您需要更新架構(gòu)和映射以支持用戶和促銷活動(dòng)之間的多對(duì)多關(guān)系,例如包含 UserId 和 PromotionId 的 UserPromotions 表。在這種情況下,我會(huì)考慮在此表/鏈接實(shí)體中分配 IsPilote,但這同樣需要邏輯來(lái)確保每次促銷圍繞 1 個(gè)試點(diǎn)進(jìn)行規(guī)則,以及用戶是否可以成為多個(gè)促銷的試點(diǎn)。
查看完整描述

3 回答

?
桃花長(zhǎng)相依

TA貢獻(xiàn)1860條經(jīng)驗(yàn) 獲得超8個(gè)贊

試試這個(gè):

var obj = JsonConvert.DeserializeObject<List<Result>>(Json);

說(shuō)明:如果 JSON 是數(shù)組,則 C# RootObject 必須從 List/IEnumerable 本身派生,或者將其反序列化為類型的列表/數(shù)組。

你可以轉(zhuǎn)儲(chǔ)你的RootObject班級(jí)。如果您想使用該RootObject類型,請(qǐng)使其派生自 List。但這不值得麻煩。


查看完整回答
反對(duì) 回復(fù) 2022-12-31
?
ITMISS

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超8個(gè)贊

您的 JSON 是一個(gè)異構(gòu)數(shù)組,包含一個(gè)字符串和一個(gè)對(duì)象。沒(méi)有一點(diǎn)幫助,這不會(huì)干凈地反序列化為強(qiáng)類型的類結(jié)構(gòu)。一種可能的解決方案是使用這樣的自定義JsonConverter:


public class ResultConverter : JsonConverter

{

    public override bool CanConvert(Type objectType)

    {

        return objectType == typeof(Result);

    }


    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)

    {

        JArray array = JArray.Load(reader);

        Result result = new Result

        {

            String = array[0].Value<string>(),

            cm = array[1].ToObject<CodeMsg>(serializer)

        };

        return result;

    }


    public override bool CanWrite

    {

        get { return false; }

    }


    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)

    {

        throw new NotImplementedException();

    }

}

然后使用如下屬性將轉(zhuǎn)換器綁定到您的Result類:[JsonConverter]


[JsonConverter(typeof(ResultConverter))]

public class Result

{

    public string String { get; set; }

    public CodeMsg cm { get; set; }

}

最后,將 JSON 反序列化到Result類中,如下所示:


var result = JsonConvert.DeserializeObject<Result>(Json);

工作演示:https ://dotnetfiddle.net/RLpm5W


注意:您可以刪除RootObject班級(jí);這里不需要。


查看完整回答
反對(duì) 回復(fù) 2022-12-31
?
MM們

TA貢獻(xiàn)1886條經(jīng)驗(yàn) 獲得超2個(gè)贊

請(qǐng)確保您的 json 字符串必須具有與 JsonHolder 類相同的屬性。


public class JsonHolder

{

    public string Id {get;set;}

    public string Name {get;set;}

    public string Gender {get;set;}

}


var jsonHolderList = new JsonConvert.DeserializeObject<List<JsonHolder>>(jsonString);

var jsonHolder = jsonHolderList.Single()

您還可以將 json 字符串轉(zhuǎn)換為 c# 對(duì)象作為動(dòng)態(tài)對(duì)象。請(qǐng)確保您的 json 字符串必須具有與 JsonHolder 類相同的屬性。


dynamic obj= new JsonConver.DeserializeObject<List<JsonHolder>>(StrJson);


查看完整回答
反對(duì) 回復(fù) 2022-12-31
  • 3 回答
  • 0 關(guān)注
  • 212 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)