דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. חילוץ ערך מ-JSON ב-#C

חילוץ ערך מ-JSON ב-#C

מתוזמן נעוץ נעול הועבר תכנות
5 פוסטים 2 כותבים 158 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • yossizY מחובר
    yossizY מחובר
    yossiz
    כתב ב נערך לאחרונה על ידי yossiz
    #1

    יש לי JSON כזה:

    string json = @"{
      ""per_account_preferences"": [
        {
          ""key"": ""103974558914302935900"",
          ""value"": {
            ""mount_point_path"": ""F""
          }
        },
        {
          ""key"": ""104413169925908349429"",
          ""value"": {
            ""mount_point_path"": ""G""
          }
        }
      ]
    }";
    

    אני רוצה לחלץ ממנו את הערך של mount_point_path כאשר per_account_preferences.key == 103974558914302935900.

    בינתיים כתבתי קוד כזה (ראה למטה 👇) וזה עובד. אני רוצה לקבל את חוות דעת המנוסים. א) האם יש בעיות בקוד? ב) האם יש דרך קלה/אלגנטית יותר? (הקוד חייב להיות עמיד מפני שינויים לא צפויים במבנה הJSON)

    var profileId = "103974558914302935900";
    
    var j = JObject.Parse(json);
    
    var val = j.SelectToken($"$.per_account_preferences[?(@.key == '{profileId}')]")?["value"]?["mount_point_path"]?.Value<string>();
    

    (אני משתמש בספרייה הפופלארית Json.NET)

    📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

    clickoneC תגובה 1 תגובה אחרונה
    0
    • yossizY מחובר
      yossizY מחובר
      yossiz
      כתב ב נערך לאחרונה על ידי yossiz
      #2

      עדכון:
      התגברתי טיפה על העצלות ובדקתי יותר בתיעוד של הספרייה Json.NET ומצאתי דרך יותר אלגנטית (לטעמי):

      var profileId = "103974558914302935900";
      
      var j = JObject.Parse(json);
      
      var val = (from pref in j["per_account_preferences"]
      	where pref["key"].Value<string>() == profileId
      	select pref["value"]?["mount_point_path"]).FirstOrDefault();
      

      אני עדיין מעוניין לקבל ביקורת/רעיונות וכו' מהחברים

      📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

      תגובה 1 תגובה אחרונה
      1
      • clickoneC מנותק
        clickoneC מנותק
        clickone
        השיב לyossiz ב נערך לאחרונה על ידי
        #3

        אני מניח שאני לא מחדש לך כלום בשורות הבאות, ובכל זאת....

        @yossiz אמר בחילוץ ערך מ-JSON ב-#C:

        (הקוד חייב להיות עמיד מפני שינויים לא צפויים במבנה הJSON)

        הJSON משתנה כל הזמן? (ז"א, הוא דינאמי לחלוטין?) או שכשהוא משתנה אתה מקבל עידכון?
        אם הוא לא דינאמי לחלוטין, הייתי ממיר אותו לאובייקט (אתה יכול דרך תפריט עריכה -> הדבקה מיוחדת ואז הוא יוצר לך ממנו אובייקט)

           public class Rootobject
            {
                public Per_Account_Preferences[] per_account_preferences { get; set; }
            }
        
            public class Per_Account_Preferences
            {
                public string key { get; set; }
                public Value value { get; set; }
            }
        
            public class Value
            {
                public string mount_point_path { get; set; }
            }
        

        אם הJSON דינאמי לחלוטין, זו אכן בעייה, אם כן, ולפי המבנה שהבאת כעת, יכול להיות שמה שמשתנה זה רק המילון של ה key+value ואת זה אפשר לעשות דינאמי, וע"ז לעשות where
        בכזה מקרה רק נצטרך להפוך את הקלאס Value למשהו שידע לקבל את שם הפרופרטי לתוך ערך
        לכאורה ככה:

            public class Value
            {
                public string key { get; set; }
                public string value { get; set; }
            }
        
        

        והקלאס המלא יהיה לכאורה

         public class Rootobject
            {
                public Per_Account_Preferences[] per_account_preferences { get; set; }
            }
        
            public class Per_Account_Preferences
            {
                public string key { get; set; }
                public Value value { get; set; }
            }
        
            public class Value
            {
                public string key { get; set; }
                public string value { get; set; }
            }
        

        ואז השאילתא תהיה

                    var list = new Rootobject();
                    var test = list.per_account_preferences.
                                            Where(x => 
                                                    x.key == "103974558914302935900" 
                                                    && x.value.key == "mount_point_path").
                                            FirstOrDefault().value.value;
        
        

        לא בדקתי שזה עובד, זה יחסית בשליפה......

        אין טסט כמו פרודקשן.

        המייל שלי urivpn@gmail.com

        yossizY תגובה 1 תגובה אחרונה
        3
        • yossizY מחובר
          yossizY מחובר
          yossiz
          השיב לclickone ב נערך לאחרונה על ידי yossiz
          #4

          @clickone אמר בחילוץ ערך מ-JSON ב-#C:

          אני מניח שאני לא מחדש לך כלום בשורות הבאות, ובכל זאת....

          אוף! אתה עניו מדי עד כדי כך שזה כבר מרגיז! כמה שנים אתה כותב #C? וכמה שעות אני? (זה יהיה שקר לומר שאני לא מכיר את השפה בשטחיות כמה שנים. אבל נסיון הכתיבה שלי מסתכם בכמה שעות) אז למה הענווה? 🙂

          הJSON משתנה כל הזמן? (ז"א, הוא דינאמי לחלוטין?) או שכשהוא משתנה אתה מקבל עידכון?

          זה לא API אלא הגדרות של תוכנה לדסקטופ. הם בטח לא מעדכנים אותי על שינויים אבל סביר להניח שזה נשאר די יציב בין גירסאות (עכשיו בדיוק התוכנה עוברת שינויים משמעותיים, מדובר על תוכנת גוגל דרייב).

          אם הוא לא דינאמי לחלוטין, הייתי ממיר אותו לאובייקט

          מה היתרון בזה? ביצועים? עוד משהו?

          (אתה יכול דרך תפריט עריכה -> הדבקה מיוחדת ואז הוא יוצר לך ממנו אובייקט)

          😮 לא יאומן! טוב לדעת! (אחת מהסיבות שלא הלכתי בכיוון הזה היתה שלא היה לי כח להמיר אותו לקלאסים)

          תודה רבה רבה!

          📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

          clickoneC תגובה 1 תגובה אחרונה
          2
          • clickoneC מנותק
            clickoneC מנותק
            clickone
            השיב לyossiz ב נערך לאחרונה על ידי clickone
            #5

            @yossiz אמר בחילוץ ערך מ-JSON ב-#C:

            מה היתרון בזה? ביצועים? עוד משהו?

            נוחות עבודה בעיקר
            אתה עובד מול קלאס נורמלי
            כשיש לך בעית המרה, תקבל שגיאה ותוכל לטפל בה במקום לנחש מה קרה

            בעבר חטאתי בעבודה עם JSON כמו הדרך שבה אתה כתבת, עד שהסבירו לי שהכי נכון טוב זה לעבוד ככה, וזה באמת ממש נח וטוב.

            אין טסט כמו פרודקשן.

            המייל שלי urivpn@gmail.com

            תגובה 1 תגובה אחרונה
            2

            בא תתחבר לדף היומי!
            • התחברות

            • אין לך חשבון עדיין? הרשמה

            • התחברו או הירשמו כדי לחפש.
            • פוסט ראשון
              פוסט אחרון
            0
            • דף הבית
            • קטגוריות
            • פוסטים אחרונים
            • משתמשים
            • חיפוש
            • חוקי הפורום