本文目錄一覽:
如何將json轉成對應的model
大部分情況使用json的格式來傳遞參數,但是使用起來就不太方便了,因此需要將json轉換成對應的model,然後對model進行操作就很便利了。json轉model的方法也有很多,推薦一個就是,jackson,方法是這樣的。 public static T obj2Obj(Object fromV…
YYModel的json轉model,model轉json完後調用的方法
//當 JSON 轉為 Model 完成後,該方法會被調用。
// 你可以在這裡對數據進行校驗,如果校驗不通過,可以返回 NO,則該 Model 會被忽略。
// 你也可以在這裡做一些自動轉換不能完成的工作。
// 當 Model 轉為 JSON 完成後,該方法會被調用。
// 你可以在這裡對數據進行校驗,如果校驗不通過,可以返回 NO,則該 Model 會被忽略。
// 你也可以在這裡做一些自動轉換不能完成的工作。
// Model:
//返回一個 Dict,將 Model 屬性名對映射到 JSON 的 Key。
iOS項目中Json轉Model的坑
打開podfile,把大名頂頂的YYModel寫上,pod install一下。再用上ESJsonFormat,直接根據json,都能把model生成好。
啥?返回的欄位值不是我們所需的
在日常開發中,經常會遇到一些介面欄位返回的值,並不是我所需要的類型的情況,這個時候,我們都會對這個欄位進行處理。
舉個栗子:
介面的json中的error_code欄位,介面會用這個欄位告訴我這次請求是否成功。比方說成功的error_code是1,平時我們為了方便開發,會在model里自己加一個自定義的屬性isSuccess,來表示本次網路請求回來之後的結果是否成功。通常的做法,要麼重寫error_code的set方法,在set的時候,做一次error_code==1的判斷,將判斷的結果,賦值給isSuccess,要麼就重寫isSuccess的get方法,get的時候,返回error_code==1的結果。
相信這些對於老司機們而言,都屬於常規操作了。那我們來看看坑在什麼地方?
我們來看這個案例:
介面返回了4個欄位值,每個欄位都用得到,所以新建一個model類來解析。
但是由於有業務需求,且為了方便開發過程區分,需要對考試名稱的欄位examSubjectName為全科或者語數外的情況,要特殊處理。所以,按照一貫的思維,我們要重寫set方法
乍一看,也沒什麼問題,解析的過程中,把欄位的值轉化為我們需要的。 而且真機實測的時候,所有的測試機都沒問題,除了一台iPhone5之外
就除了一台iPhone5,debug的時候看到set方法確實也走了,可是最終的subjectBaseId並沒有轉化成-100或者-200,可見subjectBaseId又被json本身的值覆蓋了,也就是說 set方法的執行順序,在不同CPU架構設備上存在差異。
那麼如何解決問題呢?
正是因為存在這樣的差異,所以我們只能在model所有的欄位全部set完畢之後,再做一些特殊的欄位處理,那麼如何來處理呢?
翻閱YYModel源碼,肯定能有所發現,果不其然,有所收穫。
YYModel提供了這麼個方法,它會在 +modelWithJSON: , +modelWithDictionary: , -modelSetWithJSON: and -modelSetWithDictionary: 方法結束的時候調用。
所以我們對model特殊欄位的處理,都應該放到這個方法去執行
這麼一來,問題就解決了。
注意,YYModel還有一個 – (NSDictionary *)modelCustomWillTransformFromDictionary:(NSDictionary *)dic;
這個方法很類似,但是執行的時機不一樣,這個方法是在model轉化之前執行,雖不符合本案例的需求,但是很有可能在其他類似的情況能用的上。
C#json轉為對象
方法1:
//藉助於Newtonsoft.Json.dll
public static object JsonToObject(string jsonString, object obj)
{
return JavaScriptConvert.DeserializeObject(jsonString, obj.GetType());
}
方法2:
//引用:System.Runtime.Serialization,System.ServiceModel.Web
public static object JsonToObject(string jsonString, object obj)
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
MemoryStream mStream = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
return serializer.ReadObject(mStream);
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/280605.html