Τι είναι το JSON;

Το JSON (JavaScript Object Notation) είναι ένας τρόπος αποθήκευσης και ανταλλαγής δεδομένων που μοιάζει με κείμενο. Είναι πολύ χρήσιμο γιατί μπορείς να το χρησιμοποιήσεις για να στέλνεις δεδομένα μεταξύ εφαρμογών, συσκευών, ή να το αποθηκεύσεις σε ένα αρχείο. Σκέψου το σαν έναν πίνακα από δεδομένα που μοιάζει με κείμενο, αλλά έχει συγκεκριμένη μορφή.

Παράδειγμα JSON:

{
“name”: “John”,
“age”: 30,
“city”: “New York”
}

Αυτό το JSON περιέχει τρία πεδία:

  • Το όνομα ("name") είναι "John".
  • Η ηλικία ("age") είναι 30.
  • Η πόλη ("city") είναι "New York".

Πώς χρησιμοποιούμε το JSON στην C#;

Στην C#, για να δουλέψεις με JSON, θα χρησιμοποιήσεις τη βιβλιοθήκη System.Text.Json (είναι ενσωματωμένη στην C#). Με αυτήν τη βιβλιοθήκη, μπορείς να διαβάσεις (deserialize) και να δημιουργήσεις (serialize) JSON εύκολα.

Βασικά βήματα για να δουλέψεις με JSON:

  1. Δημιουργία αντικειμένου στην C#: Θα φτιάξεις μια κλάση που μοιάζει με τη δομή του JSON.
  2. Μετατροπή του αντικειμένου σε JSON (serialize).
  3. Μετατροπή από JSON σε αντικείμενο C# (deserialize).

Παράδειγμα 1: Μετατροπή αντικειμένου σε JSON

Ας φτιάξουμε ένα απλό πρόγραμμα που δημιουργεί ένα αντικείμενο στην C# και το μετατρέπει σε JSON.

1. Δημιουργία Κλάσης

Αρχικά, θα φτιάξουμε μια κλάση που μοιάζει με το JSON που είδαμε πριν:

public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public string City { get; set; }
}

Αυτή η κλάση Person έχει 3 ιδιότητες:

  • Το Name (όνομα).
  • Το Age (ηλικία).
  • Το City (πόλη).

2. Μετατροπή Αντικειμένου σε JSON (Serialize)

Τώρα, ας μετατρέψουμε ένα αντικείμενο αυτής της κλάσης σε JSON. Θα χρησιμοποιήσουμε τη μέθοδο JsonSerializer.Serialize() για να το κάνουμε.

using System;
using System.Text.Json;

class Program
{
static void Main()
{
// Δημιουργία ενός αντικειμένου Person
Person person = new Person
{
Name = “John”,
Age = 30,
City = “New York”
};

    // Μετατροπή του αντικειμένου σε JSON
    string jsonString = JsonSerializer.Serialize(person);

    // Εκτύπωση του JSON
    Console.WriteLine(jsonString);
}

}

Τι κάνει το παραπάνω πρόγραμμα:

  • Δημιουργεί ένα αντικείμενο person με όνομα “John”, ηλικία 30 και πόλη “New York”.
  • Μετατρέπει το αντικείμενο σε μορφή JSON χρησιμοποιώντας τη μέθοδο JsonSerializer.Serialize().
  • Εκτυπώνει το JSON στην οθόνη. Το αποτέλεσμα θα μοιάζει κάπως έτσι:

{“Name”:”John”,”Age”:30,”City”:”New York”}

Παράδειγμα 2: Μετατροπή JSON σε Αντικείμενο (Deserialize)

Ας δούμε τώρα πώς να μετατρέψουμε ένα JSON πίσω σε αντικείμενο C# (deserialize).

1. Δημιουργία JSON

Έστω ότι έχουμε το παρακάτω JSON:

{
“Name”: “John”,
“Age”: 30,
“City”: “New York”
}

{
“Name”: “John”,
“Age”: 30,
“City”: “New York”
}

2. Μετατροπή JSON σε Αντικείμενο (Deserialize)

Θα χρησιμοποιήσουμε τη μέθοδο JsonSerializer.Deserialize() για να μετατρέψουμε το JSON σε ένα αντικείμενο της κλάσης Person.

using System;
using System.Text.Json;

class Program
{
static void Main()
{
// Το JSON string
string jsonString = “{\”Name\”:\”John\”,\”Age\”:30,\”City\”:\”New York\”}”;

    // Μετατροπή του JSON σε αντικείμενο Person
    Person person = JsonSerializer.Deserialize<Person>(jsonString);

    // Εκτύπωση των ιδιοτήτων του αντικειμένου
    Console.WriteLine($"Όνομα: {person.Name}, Ηλικία: {person.Age}, Πόλη: {person.City}");
}

}

Τι κάνει το παραπάνω πρόγραμμα:

  • Παίρνει το JSON string και το μετατρέπει σε ένα αντικείμενο τύπου Person.
  • Στη συνέχεια, εκτυπώνει τις ιδιότητες του αντικειμένου, δηλαδή το όνομα, την ηλικία και την πόλη.

Το αποτέλεσμα στην οθόνη θα είναι:

Όνομα: John, Ηλικία: 30, Πόλη: New York

Χρήση πιο Σύνθετων Δομών JSON

Το JSON μπορεί να είναι πιο σύνθετο και να περιέχει λίστες ή αντικείμενα μέσα σε αντικείμενα. Ας δούμε ένα παράδειγμα όπου έχουμε μια λίστα από αντικείμενα Person:

Παράδειγμα με Λίστα Αντικειμένων (JSON με Πίνακα)

[
{
“Name”: “John”,
“Age”: 30,
“City”: “New York”
},
{
“Name”: “Alice”,
“Age”: 25,
“City”: “Los Angeles”
}
]

Για να μετατρέψουμε αυτό το JSON σε λίστα αντικειμένων Person, κάνουμε τα εξής:

using System;
using System.Collections.Generic;
using System.Text.Json;

class Program
{
static void Main()
{
// Το JSON string με λίστα από αντικείμενα Person
string jsonString = “[{\”Name\”:\”John\”,\”Age\”:30,\”City\”:\”New York\”},{\”Name\”:\”Alice\”,\”Age\”:25,\”City\”:\”Los Angeles\”}]”;

    // Μετατροπή του JSON σε λίστα αντικειμένων Person
    List<Person> people = JsonSerializer.Deserialize<List<Person>>(jsonString);

    // Εκτύπωση των στοιχείων κάθε ατόμου στη λίστα
    foreach (Person person in people)
    {
        Console.WriteLine($"Όνομα: {person.Name}, Ηλικία: {person.Age}, Πόλη: {person.City}");
    }
}

}

Τι κάνει το παραπάνω πρόγραμμα:

  • Παίρνει το JSON string που περιέχει μια λίστα από δύο άτομα (John και Alice).
  • Μετατρέπει το JSON σε λίστα αντικειμένων Person με τη μέθοδο JsonSerializer.Deserialize<List<Person>>().
  • Εκτυπώνει τα στοιχεία κάθε ατόμου.

Το αποτέλεσμα στην οθόνη θα είναι:

Όνομα: John, Ηλικία: 30, Πόλη: New York
Όνομα: Alice, Ηλικία: 25, Πόλη: Los Angeles

Τι Έμαθες:

  1. Τι είναι το JSON: Ένας απλός τρόπος για να αποθηκεύεις και να ανταλλάσσεις δεδομένα σαν κείμενο.
  2. Πώς να μετατρέψεις αντικείμενο σε JSON: Με τη μέθοδο JsonSerializer.Serialize().
  3. Πώς να μετατρέψεις JSON σε αντικείμενο: Με τη μέθοδο JsonSerializer.Deserialize().
  4. Πώς να χειρίζεσαι πιο σύνθετες δομές: Όπως λίστες από αντικείμενα μέσα σε JSON.

υπάρχουν μερικά επιπλέον σημεία που είναι χρήσιμο να γνωρίζεις όταν δουλεύεις με JSON στην C#. Αυτά θα σε βοηθήσουν να καταλάβεις καλύτερα πώς να διαχειρίζεσαι JSON δεδομένα με πιο σύνθετους τρόπους και πώς να αποφύγεις κοινά λάθη.

1. Διαχείριση Μη Υποχρεωτικών (Optional) ή Άγνωστων Πεδίων

Σε πολλές περιπτώσεις, το JSON μπορεί να περιέχει πεδία που δεν είναι πάντα διαθέσιμα ή πεδία που δεν γνωρίζεις εκ των προτέρων. Μπορείς να χειριστείς αυτά τα πεδία με διάφορους τρόπους στην C#.

Χρήση nullable τύπων:

Αν κάποιο πεδίο μπορεί να είναι κενό (null) στο JSON, μπορείς να χρησιμοποιήσεις nullable τύπους στην C#.

public class Person
{
public string Name { get; set; }
public int? Age { get; set; } // Το “Age” μπορεί να είναι null
public string City { get; set; }
}

Σε αυτή την περίπτωση, αν το Age δεν υπάρχει στο JSON, το C# αντικείμενο θα το δεχτεί ως null.

2. Αγνόηση Αγνώστων Πεδίων

Αν το JSON που λαμβάνεις έχει πεδία που δεν υπάρχουν στην κλάση σου, η C# θα πετάξει σφάλμα. Ωστόσο, μπορείς να αγνοήσεις αυτά τα άγνωστα πεδία με την παρακάτω ρύθμιση:

var options = new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true,
IgnoreNullValues = true
};

Person person = JsonSerializer.Deserialize(jsonString, options);

Με το IgnoreNullValues, το JsonSerializer θα αγνοήσει οποιαδήποτε τιμή null στο JSON.

3. Χειρισμός JSON με Δυναμικά Πεδία (Dynamic JSON)

Μερικές φορές μπορεί να μην γνωρίζεις εκ των προτέρων τη δομή του JSON. Για τέτοιες περιπτώσεις, μπορείς να χρησιμοποιήσεις δυναμικά αντικείμενα ή τον τύπο JsonDocument.

Παράδειγμα με JsonDocument:

Το JsonDocument σου επιτρέπει να διαβάσεις και να εξετάσεις ένα JSON χωρίς να το μετατρέψεις πρώτα σε κλάση.

using System;
using System.Text.Json;

class Program
{
static void Main()
{
string jsonString = “{\”Name\”:\”John\”,\”Age\”:30,\”City\”:\”New York\”}”;

    // Ανάλυση του JSON με χρήση JsonDocument
    using (JsonDocument doc = JsonDocument.Parse(jsonString))
    {
        JsonElement root = doc.RootElement;

        string name = root.GetProperty("Name").GetString();
        int age = root.GetProperty("Age").GetInt32();
        string city = root.GetProperty("City").GetString();

        Console.WriteLine($"Όνομα: {name}, Ηλικία: {age}, Πόλη: {city}");
    }
}

}

4. Μορφοποίηση και Ομορφοποίηση JSON (Pretty Print)

Αν θέλεις να εκτυπώσεις το JSON σε μια πιο “ευανάγνωστη” μορφή (με διαστήματα και νέες γραμμές), μπορείς να χρησιμοποιήσεις το WriteIndented:

var options = new JsonSerializerOptions
{
WriteIndented = true
};

string jsonString = JsonSerializer.Serialize(person, options);
Console.WriteLine(jsonString);

Αυτό θα εκτυπώσει το JSON σε πιο αναγνώσιμη μορφή:

json

{
“Name”: “John”,
“Age”: 30,
“City”: “New York”
}

5. Μετονομασία Πεδίων στο JSON

Αν θέλεις να χρησιμοποιήσεις διαφορετικά ονόματα πεδίων στο JSON σε σχέση με τα ονόματα των ιδιοτήτων στην κλάση σου, μπορείς να χρησιμοποιήσεις το [JsonPropertyName] attribute.

Παράδειγμα:

using System.Text.Json.Serialization;

public class Person
{
[JsonPropertyName(“full_name”)]
public string Name { get; set; }

[JsonPropertyName("years")]
public int Age { get; set; }

public string City { get; set; }

}

Σε αυτό το παράδειγμα, το πεδίο Name στο C# θα αντιστοιχεί στο full_name στο JSON και το Age στο years.

6. Διαχείριση Λιστών και Πινάκων στο JSON

Μπορείς να διαχειριστείς λίστες (arrays) και πίνακες στο JSON με τον ίδιο τρόπο όπως χειρίζεσαι απλά αντικείμενα.

Παράδειγμα με λίστα αντικειμένων:

[
{
“Name”: “John”,
“Age”: 30,
“City”: “New York”
},
{
“Name”: “Alice”,
“Age”: 25,
“City”: “Los Angeles”
}
]

Μπορείς να το μετατρέψεις σε λίστα αντικειμένων Person:

List people = JsonSerializer.Deserialize>(jsonString);

foreach (var person in people)
{
Console.WriteLine($”Όνομα: {person.Name}, Ηλικία: {person.Age}, Πόλη: {person.City}”);
}

7. Χειρισμός Μεγάλων JSON Αρχείων

Αν διαχειρίζεσαι πολύ μεγάλα JSON αρχεία, μπορείς να χρησιμοποιήσεις ροές (streams) για να διαβάσεις το JSON κομμάτι-κομμάτι, αποφεύγοντας τη φόρτωση ολόκληρου του αρχείου στη μνήμη.

Παράδειγμα ανάγνωσης μεγάλου JSON αρχείου:

using System;
using System.IO;
using System.Text.Json;

class Program
{
static async Task Main()
{
using FileStream fs = File.OpenRead(“largefile.json”);

    // Ανάλυση μεγάλου αρχείου JSON
    using JsonDocument doc = await JsonDocument.ParseAsync(fs);
    JsonElement root = doc.RootElement;

    // Διαβάζεις και επεξεργάζεσαι τα δεδομένα
}

}

8. Συμβατότητα με Παλαιότερες JSON Βιβλιοθήκες (Newtonsoft.Json)

Παρόλο που η βιβλιοθήκη System.Text.Json είναι η επίσημη και σύγχρονη λύση για διαχείριση JSON στην C#, πολλοί προγραμματιστές χρησιμοποιούν ακόμη τη βιβλιοθήκη Newtonsoft.Json λόγω της ευκολίας της και των δυνατοτήτων της.

Παράδειγμα με Newtonsoft.Json:

using Newtonsoft.Json;

class Program
{
static void Main()
{
string jsonString = “{\”Name\”:\”John\”,\”Age\”:30,\”City\”:\”New York\”}”;

    // Μετατροπή JSON σε αντικείμενο με Newtonsoft.Json
    Person person = JsonConvert.DeserializeObject<Person>(jsonString);

    Console.WriteLine($"Όνομα: {person.Name}, Ηλικία: {person.Age}, Πόλη: {person.City}");
}

}

Μπορείς να προσθέσεις αυτή τη βιβλιοθήκη στο project σου με το NuGet package manager, αν χρειαστείς κάποια επιπλέον δυνατότητα.


Συμπέρασμα

Η διαχείριση JSON στην C# είναι πολύ ισχυρή και σου δίνει τη δυνατότητα να διαχειρίζεσαι δεδομένα με πολλούς τρόπους. Οι βασικές τεχνικές είναι:

  • Serialize: Μετατροπή αντικειμένων σε JSON.
  • Deserialize: Μετατροπή JSON σε αντικείμενα.
  • Χειρισμός αγνώστων ή μη υποχρεωτικών πεδίων.
  • Μετονομασία πεδίων.
  • Διαχείριση λιστών και μεγάλων αρχείων JSON.