Uproszczenie Kodu

0
private string[] mApiKeys = { "title", "description", "bookletImage", "iconImage", "photoImage", "bundles" }; 
	public override JSONObject ToJSONObject()
	{
		JSONObject jsonObj = base.ToJSONObject();
		jsonObj.Add(mApiKeys[0], new JSONValue(mTitle));
		jsonObj.Add(mApiKeys[1], new JSONValue(mDescription));
		JSONObject tempObj = new JSONObject();
		tempObj.Add(mStringSource, new JSONValue(mBookletImageUrl));
		jsonObj.Add(mApiKeys[2], new JSONValue(tempObj));
		tempObj = new JSONObject();
		tempObj.Add(mStringSource, new JSONValue(mIconImageUrl));
		jsonObj.Add(mApiKeys[3], new JSONValue(tempObj));
		tempObj = new JSONObject();
		tempObj.Add(mStringSource, new JSONValue(mPhotoImageUrl));
		jsonObj.Add(mApiKeys[4], new JSONValue(tempObj));
		JSONArray array = new JSONArray();
		foreach (ApiBundle bundle in mApiBundles)
		{
			array.Add(new JSONValue(bundle.ToJSONObject()));
		}
		jsonObj.Add(mApiKeys[5], new JSONValue(array));
		return jsonObj;
	}
	public override void SerializeFromJSON(JSONObject jsonObj)
	{
		mID = jsonObj.GetString(mIdString);
		mTitle = jsonObj.GetString(mApiKeys[0]);
		mDescription = jsonObj.GetString(mApiKeys[1]);
		if (jsonObj.GetObject(mApiKeys[2]) != null)
		{
			mBookletImageUrl = jsonObj.GetObject(mApiKeys[2]).GetString(mStringSource);
		}
		if (jsonObj.GetObject(mApiKeys[3]) != null)
		{
			mIconImageUrl = jsonObj.GetObject(mApiKeys[3]).GetString(mStringSource);
		}
		if (jsonObj.GetObject(mApiKeys[4]) != null)
		{
			mPhotoImageUrl = jsonObj.GetObject(mApiKeys[4]).GetString(mStringSource);
		}
		JSONArray bundlesArray = jsonObj.GetArray(mApiKeys[5]);
		foreach (var arrayValue in bundlesArray)
		{
			ApiBundle bundle = new ApiBundle();
			bundle.SerializeFromJSON(arrayValue.Obj);
			mApiBundles.Add(bundle);
		}
	}
} 

Wartosci ktore sa przyjowane tam rozne wartosci. int, string, bool, a nawet lista jakiegos obiektu. Nie podoba mi sie to ze jest [1][2][3] i tak sie zastanawiam jak mozna to zmienic. Myslalem nad Dictionary ktore nie ma okreslonego typu jezeli chodzi o value (nie pamietam nazwy, hashDictionary?), ale wtedy w sumie nie bede mial jak sprawdzic czy to jest lista tak latwo (a moze jest na to sposob?)

mozna wpisac po prostu tam stringi, ale czy nie da sie bardziej "fancy"?

0

Możesz Enuma z atrybutem Description.

0

mozesz pokazac jakis kawalek kodu? Bo nie widze zeby to rozwiazywalo problemu. Nawet nie wiem o co dokladnie Ci chodzi

Jedynie co wymyslilem to wlasna struktura danych ktora sprawdza typeof i w zaleznosci od typeof robi cos. Mozna tez zrobic to z callbackami i przechowywac callbacki w mapie (ktora funkcje trzeba wykonac w zaleznosci od typu) ale to tez nie do konca chyba przejdzie. A dwa ze to bedzie bardzo duzo pisania :D

1

Na 100% jest na to jakieś gotowe rozwiązanie, które na podstawie meta danych klasy automatycznie serializuje i deserializuje obiekt do/z JSON-a, wiec można ten kod zredukować do dwóch linijek.

W najgorszym razie samemu można coś takiego napisać (nie jest to trudne).


Nawet już coś znalazłem: w dokumentacji Microsoft jest wspomniany taki projekt na github.
0

Może to Ci się przyda http://stackoverflow.com/questions/6201529/turn-c-sharp-object-into-a-json-string-in-net-4 (strzelam, nie jestem pewien :D)

0

Tak jak napisałem wcześniej. Enum z atrybutem Description.
Np.

private string[] mApiKeys = { "title", "description", "bookletImage", "iconImage", "photoImage", "bundles" };

Zmieniasz na:

public enum ApiKeysEnum
{
[Description("title")]
Titile = 1,
[Description("description")]
Description = 2,
[Description("bookletImage")]
BookletImage = 3,
....
itd...
}

1

A te mApiKeys się kiedyś zmienia? Możesz użyć stałych

private const string Title = "title";
private const string Description = "description";

no i masz ładniej:

mTitle = jsonObj.GetString(Title);

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