[英]Newtosoft, PCL & Xamarin.Droid
我正面臨一個奇怪的問題。
我的PCL項目中有一個通用代碼。 這段代碼目前在我的Windows Phone項目中正常運行,但是在android系統中卻沒有。
這里的代碼:(有問題的方法是CreateListFriend)
public class Friend : IFriend<User>
{
public int Id { get; set; }
public string UserId { get; set; }
public virtual User User { get; set; }
private static volatile Friend instance;
private static object syncRoot = new Object();
private Friend() { }
public static Friend Instance
{
get
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
instance = new Friend();
}
}
return instance;
}
}
/// <summary>
/// Populate friend instance
/// </summary>
/// <param name="json">Json friend string</param>
public void PopulateFriend(string json)
{
if (!String.IsNullOrEmpty(json))
{
var resultObj = JsonConvert.DeserializeObject<Friend>(json);
Friend.Instance.Id = resultObj.Id;
Friend.Instance.UserId = resultObj.UserId;
}
}
/// <summary>
/// Create friend list from json
/// </summary>
/// <param name="json">json string</param>
/// <returns>friend list</returns>
public List<Friend> CreateListFriend(string json)
{
List<Friend> resultObj = new List<Friend>();
if (!String.IsNullOrEmpty(json))
{
resultObj = JsonConvert.DeserializeObject<List<Friend>>(json);
}
return resultObj;
}
}
如上圖所示,Json.net可以“反序列化”,但是對象朋友donc具有正確的“字段”。
我已經嘗試抑制該類並重新創建它...我已經創建了一個具有相同字段的結構,並且所有json都正確地反序列化了它,但是我不想這樣做。
有人有主意嗎?
假設我們有兩個JSON
源文件:
friend.json:
{
"id": 5,
"userId": 6
}
friends.json:
[
{
"id": 1,
"userId": 2
},
{
"id": 2,
"userId": 3
},
{
"id": 3,
"userId": 4
},
{
"id": 4,
"userId": 5
}
]
我們也有Friend
類。 根據您的示例,您的課程是針對實體框架的POCO。 如果源文件的屬性名稱與您的類相同,則不需要JsonProperty
屬性。
注意:我沒有為Friend
類定義任何構造函數,因此默認情況下它將只有一個公共的無參數構造函數。
public class Friend
{
[JsonProperty("id")]
public int Id { get; set; }
[JsonProperty("userId")]
public string UserId { get; set; }
public virtual User User { get; set; }
public override string ToString()
{
return String.Format("User: Id={0}; UserId={1}", Id, UserId);
}
}
我將分離創建Friend
實例的邏輯。 僅作為示例,我創建一個FriendLoader
類。
public class FriendLoader
{
public Friend LoadFriend(string jsonSource)
{
return String.IsNullOrEmpty(jsonSource) ? null : JsonConvert.DeserializeObject<Friend>(jsonSource);
}
public List<Friend> LoadFriends(string jsonSource)
{
var friends = new List<Friend>();
if (!String.IsNullOrEmpty(jsonSource))
{
friends = JsonConvert.DeserializeObject<List<Friend>>(jsonSource);
}
return friends;
}
}
這是用於測試上述代碼的控制台應用程序。
class Program
{
static void Main(string[] args)
{
string friendJson = File.ReadAllText("friend.json");
string friendsJson = File.ReadAllText("friends.json");
var loader = new FriendLoader();
var friend = loader.LoadFriend(friendJson);
var friends = loader.LoadFriends(friendsJson);
Console.WriteLine("One friend:");
Console.WriteLine(friend);
Console.WriteLine();
Console.WriteLine("List of friends:");
friends.ForEach(Console.WriteLine);
}
}
希望這可以幫助。
順便問一下,能否請您顯示IFriend<T>
接口的定義?
抱歉,我本周沒有時間發布。
這與我的課程無關,但與android.platform有關。
我們只需要告訴android平台使用以下命令保留所有屬性:
[Preserve(AllMembers = true)]
謝謝你的時間 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.