Telegram Web
🤝استخدام در شریف کلینیک 🚀
ما در شریف کلینیک به دنبال افراد باانگیزه و باتجربه برای موقعیت‌های زیر هستیم 👇

💻 Java (Mid / Senior)
⚙️ Laravel (Mid / Senior)
📱 Flutter (Mid / Senior)
🌐 Next.js / React (Mid / Senior)

اگر در یکی از این حوزه‌ها تجربه و علاقه دارید،
📩 رزومه‌تون رو به ایمیل زیر ارسال کنید:
[email protected]

🏃‍♂️ تمام‌وقت | حضوری
📍 محل کار: شریف کلینیک

➡️اشتراک 👍لایک 💬کامنت

⚡️ @javapro_ir
✈️@group_javapro
Please open Telegram to view this post
VIEW IN TELEGRAM
✳️ کار با JsonNode و Tree Model در Jackson — دسترسی به داده‌های JSON بدون نیاز به ساخت کلاس

در بسیاری از مواقع، ممکن است بخواهید به داده‌های داخل یک فایل یا رشته‌ی JSON دسترسی پیدا کنید بدون اینکه ابتدا کلاس جاوایی (POJO) برای آن بسازید. در این حالت، کتابخانه‌ی Jackson راهکاری قدرتمند به نام Tree Model API ارائه می‌دهد که با استفاده از کلاس `JsonNode`، امکان پیمایش و خواندن داده‌ها را به‌صورت درختی فراهم می‌کند.


🔹 ۱. مفهوم Tree Model در Jackson
در این مدل، داده‌ی JSON مانند یک درخت در نظر گرفته می‌شود که شامل گره‌ها (Nodes) است.
هر گره می‌تواند یک Object،Array، یا Value باشد.
کلاس اصلی برای کار با این مدل، `JsonNode` است که از طریق `ObjectMapper` ساخته می‌شود.


🔹 ۲. نمونه‌ی کد — خواندن و دسترسی به داده‌ها


import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonNodeExample {
public static void main(String[] args) throws Exception {
String json = """
{
"name": "Saleh",
"age": 25,
"skills": ["Java", "Spring", "Networking"],
"address": {
"city": "Tehran",
"country": "Iran"
}
}
""";

ObjectMapper mapper = new ObjectMapper();
JsonNode root = mapper.readTree(json);

// دسترسی به مقادیر
String name = root.get("name").asText();
int age = root.get("age").asInt();
String firstSkill = root.get("skills").get(0).asText();
String city = root.get("address").get("city").asText();

System.out.println("Name: " + name);
System.out.println("Age: " + age);
System.out.println("First Skill: " + firstSkill);
System.out.println("City: " + city);
}
}


📍 خروجی برنامه:


Name: Saleh
Age: 25
First Skill: Java
City: Tehran



🔹 ۳. بررسی دقیق‌تر JsonNode

* متد get() برای دسترسی به یک کلید خاص در شیء JSON استفاده می‌شود.
* متد asText()`، `asInt() و سایر متدهای asType() برای تبدیل مقدار گره به نوع داده‌ی مورد نظر کاربرد دارند.
* می‌توانید با متد isArray() و isObject() نوع گره را بررسی کنید.


🔹 ۴. مثال پیشرفته‌تر — پیمایش روی آرایه‌ها


for (JsonNode skill : root.get("skills")) {
System.out.println("Skill: " + skill.asText());
}


📍 خروجی:


Skill: Java
Skill: Spring
Skill: Networking



🧠 جمع‌بندی:
استفاده از JsonNode و Tree Model در Jackson زمانی مفید است که:

* ساخت کلاس برای JSON ضروری نیست یا داده‌ها پویا هستند.
* می‌خواهید تنها بخشی از داده را بخوانید.
* نیاز دارید ساختار JSON را بررسی یا تحلیل کنید.

اگر داده‌های JSON ساختار ثابتی دارند، بهتر است از Data Binding (با کلاس‌های جاوا) استفاده کنید، اما اگر داده‌ها پویا یا ناشناخته‌اند، Tree Model بهترین گزینه است.

#کاربرـحرفهـای


🆔 @javapro_ir
🆔 @group_javapro
👍3
✳️ موضوع: Pattern Matching در switch — ویژگی قدرتمند از جاوا 17 به بعد

در نسخه‌های جدید جاوا، یکی از تغییرات مهم و زیبا، اضافه شدن Pattern Matching در عبارت‌های switch است. این ویژگی باعث می‌شود کدهای شرطی ما خواناتر، کوتاه‌تر و ایمن‌تر از نظر نوع داده (Type-Safe) شوند.


🔹 ۱. مشکل در نسخه‌های قدیمی‌تر
در نسخه‌های قدیمی جاوا، وقتی از switch استفاده می‌کردیم، فقط نوع‌های ساده مانند int, String یا enum پشتیبانی می‌شدند.
برای بررسی نوع (type) یک شیء، مجبور بودیم از instanceof استفاده کنیم و سپس آن را cast کنیم:

static String format(Object obj) {
    if (obj instanceof Integer) {
        Integer i = (Integer) obj;
        return "Integer: " + i;
    } else if (obj instanceof String) {
        String s = (String) obj;
        return "String: " + s;
    } else {
        return "Unknown Type";
    }
}


کد بالا تکراری و مستعد خطاست. جاوا 17 با اضافه کردن Pattern Matching در switch این مشکل را به شکلی ظریف و هوشمند حل کرد.


🔹 ۲. Pattern Matching در switch — نسخه‌ی جدید و تمیزتر

در نسخه‌های جدید، می‌توانیم مستقیماً نوع متغیر را در case تعریف کنیم، بدون نیاز به casting دستی:

static String format(Object obj) {
    return switch (obj) {
        case Integer i -> "Integer: " + i;
        case String s -> "String: " + s.toUpperCase();
        case null -> "Null value detected!";
        default -> "Unknown Type";
    };
}


📍 توضیح:

* در case Integer i، اگر نوع ورودی Integer باشد، به‌صورت خودکار متغیر i ساخته می‌شود.
* نیازی به instanceof یا cast دستی نیست.
* مقدار بازگشتی با فلش -> تعریف می‌شود و در یک خط قابل نوشتن است.


🔹 ۳. مثال کامل از کاربرد عملی

public class PatternMatchingSwitch {
    public static void main(String[] args) {
        System.out.println(describe(42));
        System.out.println(describe("Saleh"));
        System.out.println(describe(3.14));
        System.out.println(describe(null));
    }

    static String describe(Object obj) {
        return switch (obj) {
            case Integer i -> "Integer number: " + i;
            case String s when s.length() > 5 -> "Long String: " + s;
            case String s -> "Short String: " + s;
            case Double d -> "Double number: " + d;
            case null -> "Null value!";
            default -> "Unknown type";
        };
    }
}


📍 خروجی برنامه:
Integer number: 42
Long String: Saleh
Double number: 3.14
Null value!

🔹 ۴. ویژگی جالب – استفاده از شرط اضافی (when clause)
عبارت when در جاوا 21 به switch اضافه شد و به شما اجازه می‌دهد برای هر case شرط خاصی تعریف کنید.
در مثال بالا، case String s when s.length() > 5 فقط زمانی اجرا می‌شود که مقدار obj رشته‌ای و طول آن بیشتر از ۵ کاراکتر باشد.


🔹 ۵. مزایای Pattern Matching در switch

* حذف کدهای تکراری و نیاز به cast دستی
* افزایش ایمنی نوع داده‌ها (Type Safety)
* افزایش خوانایی و سادگی کد
* امکان ترکیب شرط‌ها با when برای کنترل دقیق‌تر


🧠 جمع‌بندی:
ویژگی Pattern Matching در switch یکی از گام‌های بزرگ جاوا به سمت کدنویسی تابعی‌تر و خواناتر است.
این قابلیت نه‌تنها از نظر ظاهری زیباتر است، بلکه خطاهای احتمالی ناشی از تبدیل نوع را نیز کاهش می‌دهد.

#کاربرـحرفهـای


🆔 @javapro_ir
🆔 @group_javapro
👍5
2025/10/21 13:18:30
Back to Top
HTML Embed Code: