将额外的字符串值添加到Dictionary / Json

时间:2017-05-24 19:14:06

标签: c# json asp.net-mvc

我有一个让所有朋友上网的功能,现在我想在Json字符串中添加一个名为 ProfilePic 的额外值。

使用下面的代码,我得到了朋友ID。 ProfilePic值位于UserDTO中,数据库中的列名称为ProfilePic

我的问题是我不知道如何在json字符串中获取该值。

public override Task OnConnected()
    {

        // Init db
        Db db = new Db();

        // Get user id
        UserDTO userDTO = db.Users.Where(x => x.Username.Equals(Context.User.Identity.Name)).FirstOrDefault();
        int userId = userDTO.Id;


        // Get all online ids
        List<int> onlineIds = db.Online.ToArray().Select(x => x.Id).ToList();

        // Get friends ids
        List<int> friendIds1 = db.Friends.Where(x => x.User1 == userId && x.Active == true).ToArray().Select(x => x.User2).ToList();

        List<int> friendIds2 = db.Friends.Where(x => x.User2 == userId && x.Active == true).ToArray().Select(x => x.User1).ToList();

        List<int> allFriendsIds = friendIds1.Concat(friendIds2).ToList();


        // Get final set of ids
        List<int> resultList = onlineIds.Where((i) => allFriendsIds.Contains(i)).ToList();

        // Create a dict of friend ids and usernames
        Dictionary<int, string> dictFriends = new Dictionary<int, string>();

        foreach (var id in resultList)
        {
            var users = db.Users.Find(id);
            string friend = users.Username;


            string ProfilePic = users.ProfilePic;

            if (!dictFriends.ContainsKey(id))
            {
                dictFriends.Add(id, friend);
            }
        }

        var transformed = from key in dictFriends.Keys
                          select new { id = key, friend = dictFriends[key], ProfilePic = "VALUE HERE" };

        string json = JsonConvert.SerializeObject(transformed);

        // Set Clients
        var clients = Clients.Caller;

        // Call js function
        clients.getonlinefriends(Context.User.Identity.Name, json);

        // Return
        return base.OnConnected();
    }

2 个答案:

答案 0 :(得分:1)

您遇到的问题是您没有将所有数据库信息记录到同一个对象中。您试图将过多信息放入单个键值配对字典中。相反,您应该创建一个帮助程序类,以更好地表示您返回给客户端的模型。例如:

public class UserJson
{
    public string Name {get; set;}
    public int Id {get; set;}
    public string ProfilePic {get; set;}
}

然后在你查询数据库的循环中,然后创建这些对象,然后JsonConvert

var userList = new List<UserJson>();
foreach (var id in resultList)
{
    var users = db.Users.Find(id);
    string friend = users.Username;
    string profilePic = users.ProfilePic;

    userList.Add(new UserJson {Name = friend, Id = id, ProfilePic = profilePic });
}
string json = JsonConvert(userList);

或者,如果确实不想创建帮助程序类,则可以使用List<dynamic>个匿名对象。但是使用帮助程序类有助于更好地封装代码(例如验证代码)。

Demo on .NET Fiddle

答案 1 :(得分:0)

您可以使用元组而不是字典。

来自msdn的

Tuples

// Create a 7-tuple.
var population = new Tuple<string, int, int, int, int, int, int>(
                           "New York", 7891957, 7781984, 
                           7894862, 7071639, 7322564, 8008278);
// Display the first and last elements.
Console.WriteLine("Population of {0} in 2000: {1:N0}",
                  population.Item1, population.Item7);
// The example displays the following output:
// Population of New York in 2000: 8,008,278

在你的情况下它将是

List<Tuple<int, string, string>>

您还可以创建一个类来保存结果。