簡體   English   中英

Newtosoft,PCL和Xamarin.Droid

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM