Parsowanie json

0

Pewna strona udostępnia api, dzięki któremu możemy pobrać informacje o konkretnym użytkowniku. Wynik dostajemy w formacie JSON, który zawiera informacje takie jak: id, nick, data rejestracji itd. Przykład:
{"id":100,"nick":"foo","registered_at":"2017-08-19 17:55:04"}

Stworzyłem więc klasę User, która odpowiada wynikowi JSON.

public class User {
	public int id {get; set;}
	public string nick {get; set;}
	public DateTime registeredAt {get; set;}

	public static User FromId(int id) {
		RestClient apiClient = new RestClient("https://api.site.com");
        RestRequest scrapeRequest = new RestRequest("/users/" + id);
        string response = apiClient.Execute(scrapeRequest).Content;
        return User.FromJson(response);
	}
	
	public static User FromJson(string json) {
		return JsonConvert.DeserializeObject<User>(json);
	}
}

Jak widać w kodzie powyżej dodałem też metodę FromId, której parametrem jest id użytkownika a zwracany jest obiekt z wypełnionymi właściwościami na podstawie wyniku JSON.

Dodałem kolejką klasę: Account

public class Account : User {
	public string Email {get; private set;}
	public string Password {get; private set;}
	private CookieContainer Cookie = new CookieContainer();
	
	public Account(string email, string password) {
		this.Email = email;
		this.Password = password;
	}
	
	public bool Login() {
		//zaloguj sie i zaktualizuj ciasteczka
	}
}

Account dziedziczy po User, co wydaje się być logiczne. Jednak pomimo, że znałbym id konkretnego obiektu Account nie mam zbytnio możliwości, by zaktualizować dane obiektu Account używając metody FromId.

Będąc zalogowany i wykonując żądanie https://api.site.com/users/me otrzymuję JSON z informacją o mnie, czyli zalogowanym użytkowniku. Jednak sposób w jaki ja tworzę obiekt na podstawie JSON opiera się na tym, że serializuję string w obiekt. Nie zrobię przecież coś takiego:
Mógłbym dodać taką metodę w klasie Account:

public void UpdateDetails() {
		RestClient apiClient = new RestClient("https://api.site.com");
        RestRequest scrapeRequest = new RestRequest("/users/me");
        string response = apiClient.Execute(scrapeRequest).Content;
		User myAcc = User.FromJson(response);
        
		this.id = myAcc.id;
		this.nick = myAcc.nick;
		this.registeredAt = myAcc.registeredAt;	
}

Jednak takie rozwiązanie wydaje mi się słabe. W rzeczywistości nie musiałbym przepisać 3 właściwości, ale o wiele więcej. Jak więc to powinno wyglądać?

Mam jeszcze wątpliwości co do kilku rzeczy:
Używając generatorów json -> class tworzą one właściwości publiczne z publicznym set. Czy nie powinno być tak, że set powinno być private/protected?
Owe generatory stworzyły mi właściwości z małej litery. Nie powinne być one z wielkiej?

Co uważacie o tym kodzie? Co możnaby zrobić lepiej?

1

Kontrakty JSONa to powinny być DTO nie zawierające żadnej logiki.
Settery nie mogą być prywatne, bo nie będzie możliwa deserializacja. A poza tym w DTO to i tak nie ma znaczenia.
Właściwości możesz zmienić na pisane pascal case, deserializator sobie z tym poradzi.

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