חילוץ ערך מ-JSON ב-#C
-
יש לי 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)
-
עדכון:
התגברתי טיפה על העצלות ובדקתי יותר בתיעוד של הספרייה 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();
אני עדיין מעוניין לקבל ביקורת/רעיונות וכו' מהחברים
-
אני מניח שאני לא מחדש לך כלום בשורות הבאות, ובכל זאת....
@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;
לא בדקתי שזה עובד, זה יחסית בשליפה......
-
@clickone אמר בחילוץ ערך מ-JSON ב-#C:
אני מניח שאני לא מחדש לך כלום בשורות הבאות, ובכל זאת....
אוף! אתה עניו מדי עד כדי כך שזה כבר מרגיז! כמה שנים אתה כותב #C? וכמה שעות אני? (זה יהיה שקר לומר שאני לא מכיר את השפה בשטחיות כמה שנים. אבל נסיון הכתיבה שלי מסתכם בכמה שעות) אז למה הענווה?
הJSON משתנה כל הזמן? (ז"א, הוא דינאמי לחלוטין?) או שכשהוא משתנה אתה מקבל עידכון?
זה לא API אלא הגדרות של תוכנה לדסקטופ. הם בטח לא מעדכנים אותי על שינויים אבל סביר להניח שזה נשאר די יציב בין גירסאות (עכשיו בדיוק התוכנה עוברת שינויים משמעותיים, מדובר על תוכנת גוגל דרייב).
אם הוא לא דינאמי לחלוטין, הייתי ממיר אותו לאובייקט
מה היתרון בזה? ביצועים? עוד משהו?
(אתה יכול דרך תפריט עריכה -> הדבקה מיוחדת ואז הוא יוצר לך ממנו אובייקט)
לא יאומן! טוב לדעת! (אחת מהסיבות שלא הלכתי בכיוון הזה היתה שלא היה לי כח להמיר אותו לקלאסים)
תודה רבה רבה!
-
@yossiz אמר בחילוץ ערך מ-JSON ב-#C:
מה היתרון בזה? ביצועים? עוד משהו?
נוחות עבודה בעיקר
אתה עובד מול קלאס נורמלי
כשיש לך בעית המרה, תקבל שגיאה ותוכל לטפל בה במקום לנחש מה קרהבעבר חטאתי בעבודה עם JSON כמו הדרך שבה אתה כתבת, עד שהסבירו לי שהכי נכון טוב זה לעבוד ככה, וזה באמת ממש נח וטוב.