GSON - jak używać?

0

Cześć, szukałem jakiegoś w miarę optymalnego sposobu na przechowywanie danych o użytkownikach (bot na serwer TS3) i doszedłem do wniosku, że przechowywanie w JSON będzie lepszym rozwiązaniem niż ciągłe połączenie z bazą MySQL (jeśli się mylę, poprawcie mnie :D ).

Trochę się bawiłem, narobiłem sobie w kodzie totalnego syfu, a i tak nic z tego nie wyszło, próbowałem posiłkować się informacjami z Google, ale nadal nic...
Ma to działać tak, że przy wejściu klienta na serwer, funkcja przeszukuje JSON w poszukiwaniu informacji o nim, jeżeli nie znajdzie - tworzy go (obiekt klasy np. Klient) i dodaje do JSONa. Natomiast jeśli znajdzie, ma tworzyć nowy obiekt (np. wspomnianej klasy Klient), przypisać do niego informacje (nick, id), a następnie wrzucić te informacje do JSONa.
Kolejną rzeczą jest to, że co minutę wartości wszystkich aktualnie obecnych na serwerze klientów mają być aktualizowane.
Lista aktualnie obecnych klientów raczej będzie ciągle przechowywana w List<Klient>, natomiast przy odłączeniu klienta, będzie on z niej usuwany.

Format, który chciałbym uzyskać:

"userid" {//String, po którym klient będzie wyszukiwany
   "nickname": "klient123", // String aktualizowany przy połączeniu klienta
   "time":   "21" // int aktualizowany co minutę
}
]```

Jest ktoś w stanie pomóc? :/
0

Ale po co ci ten json? Chcesz dane o użytkownikach zapisywać do pliku? Jeśi będziesz pisać z wielu wątków do jednego pliku to ci się to wywali

1

W bazach NoSQL są osobne dokumenty jako jsony. W twoim przypadku każdy user to osobny dokument. Dostęp do nich jest po kluczu. W takim podejściu nie ma blokowania przy przetwarzaniu przez równoległe procesy.

1

W czym jest problem? Modelujesz sobie jakoś klasę do przechowywania danych

public class Client {
    String nickname;
    int time;
}

A w programie dane trzymasz w mapie

Map<String, Client> clients;

I co minutę sobie możesz odczytywać / zapisywać te dane

String JSON_FILE_PATH = "/sciezka/do/pliku/clients.json";
Gson gson = new Gson();

// odczyt
clients = gson.fromJson(new BufferedReader(new FileReader(JSON_FILE_PATH)), HashMap.class);
//zapis
gson.toJson(clients, new FileWriter(JSON_FILE_PATH));

No i jasne, że trochę logiki jeszcze musisz dodać żeby sumować czas pobytu w zależności od tego jak przechwytujesz zalogowanych klientów.
To jest najprostszy sposób - czytanie całego pliku. Jeśli chcesz się w parsowanie pojedynczych elementów to możesz się pobawić w JsonTree i używać JsonElement, ale raczej nie warto.

W Twoim problemie jest prawdopodobieństwo zapisu i odczytu przez 2 wątki jednocześnie, więc rozważ użycie np. ConcurrentHashMap

1 użytkowników online, w tym zalogowanych: 0, gości: 1