Newtosoft,PCL& Xamarin.Droid

时间:2016-06-04 10:13:49

标签: c# json json.net xamarin.android

我正面临一个奇怪的问题。

我的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;

        }
    }

enter image description here

正如您在上一张图片中看到的那样,Json.net能够“反序列化”,但对象朋友donc拥有正确的“字段”....

我已经试图压制这个类并重新创建它...... 我已经创建了一个具有相同字段的结构,所有json都正确反序列化,但我不想这样做。

有人有想法......

2 个答案:

答案 0 :(得分:0)

假设我们有两个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>界面的定义?

答案 1 :(得分:0)

对不起延迟我本周没有时间发帖。

这与我的课无关,而是与android.platform有关。

我们只需要告诉android平台保留所有属性:

[Preserve(AllMembers = true)]

感谢您的时间:)