字典到json与关键名称

时间:2017-01-27 09:54:28

标签: c# json

我有一个字典String world = "world"; Preconditions.checkNotNull(string, "Hello %s",world);的整数和字符串,其中整数是ids,字符串是用户名,当我使用Dictionary<int, string>将其转换为JSON时,我得到如下内容:

Json.NET

我将其转换为:

{"3":"jack","2":"john"}

但我希望得到这样的东西:

Dictionary<int, string> dictFriends = new Dictionary<int, string>();

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

    dictFriends.Add(id, friend);
}

string json = JsonConvert.SerializeObject(dictFriends);

有可能吗?

3 个答案:

答案 0 :(得分:3)

据我所知,您必须将字典转换为JSON.NET认为是IEnumerable的字典:

// YOUR DICTIONARY
var dictFriends = new Dictionary<int, string>() {
    {1,"Jack"},
    {2,"John"},
    {3,"Jeff"}
};

// TRANSFORM INTO IENUMERABLE
var transformed = from key in dictFriends.Keys
                  select new { id = key, user = dictFriends[key] };

// SERIALIZE
var json = JsonConvert.SerializeObject(transformed);

输出:

  

[
  {&#34; id&#34;:1,&#34;用户&#34;:&#34; Jack&#34;},
  {&#34; id&#34;:2,&#34;用户&#34;:&#34; John&#34;},
  {&#34; id&#34;:3,&#34;用户&#34;:&#34; Jeff&#34;}
  ]

答案 1 :(得分:0)

您尝试将字典用作数组/列表,写入现有密钥将覆盖它。此外,您当前的密钥类型为int,因此您将拥有JSON输出,例如

{1: "jack", 2: "john"}

而是将对象类型设置为List<Dictionary<string, Object>>

List<Dictionary<string, object>> friends = new List<Dictionary<string, Object>>();

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

    Dictionary<string, object> dictFriend = new Dictionary<string, Object>();
    dictFriend.Add("id", id);
    dictFriend.Add("name" , friend);
    friends.Add(dictFriend);
}

string json = JsonConvert.SerializeObject(friends);

答案 2 :(得分:0)

您可以使用2https://msdn.microsoft.com/en-us/library/system.runtime.serialization.json.datacontractjsonserializer(v=vs.110).aspx

以下将以您之后的形式生成输出;只代替ifDataContractJsonSerializer,您的字段将被命名为iduser。原因是这些是字典上的属性名称。

如果您还需要更改这些名称(即它不仅仅是您感兴趣的结构),您还需要使用自定义类覆盖字典,您可以在其中添加属性key等属性可更改其解析方式...有关详情,请参阅http://www.newtonsoft.com/json/help/html/SerializationAttributes.htm

value

示例输出:

[JsonProperty(PropertyName = "User")]