【问题标题】:dictionary to json with key names字典到带有键名的 json
【发布时间】:2017-01-27 09:54:28
【问题描述】:

我有一个包含整数和字符串的字典 Dictionary<int, string>,其中整数是 id,字符串是用户名,当我使用 Json.NET 将其转换为 JSON 时,我得到如下内容:

{"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);

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

[
{ "id": "3", "user": "jack"},
{ "id": "2", "user": "john"},
]

有可能吗?

【问题讨论】:

  • 你的dictFriends看起来怎么样
  • 在 JSON 中,对象被序列化为字典。如果您希望将值序列化为对象的属性,请使用对象列表,而不是字典。例如,resultList.Select(new {id=id,user=friend);
  • 您使用的是哪个 ORM?您可以修改您的查询,使其仅返回一个对象列表,其中仅包含可以直接序列化的 ID、Name 属性。在 EF 中,您可以将整个代码更改为 db.Users.Where(u=&gt;resultList.Contains(u=&gt;u.ID)).Select(u=&gt;new {id=u.ID, user=u.UserName});。 LINQ to NH 可以使用完全相同的查询。

标签: c# json


【解决方案1】:

据我所知,您必须将字典转换为 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);

输出:

[
{"id":1, "user":"Jack"},
{"id":2, "user":"John"},
{"id":3, "user":"Jeff"}
]

【讨论】:

    【解决方案2】:

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

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

    而是将您的对象类型设置为List&lt;Dictionary&lt;string, Object&gt;&gt;

    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);
    

    【讨论】:

      【解决方案3】:

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

      以下内容将以您所追求的形式产生输出;您的字段将被命名为 keyvalue,而不是 iduser。原因是那些是字典上的属性名称。

      如果您还需要更改这些名称(即不仅仅是您感兴趣的结构),您需要使用自定义类覆盖字典,您可以在其中添加属性,例如 [JsonProperty(PropertyName = "User")] 到属性以更改它们的解析方式...有关更多信息,请参阅http://www.newtonsoft.com/json/help/html/SerializationAttributes.htm

      Dictionary<int, string> dictFriends = new Dictionary<int, string>();
      
      dictFriends.Add(1, "Alice");
      dictFriends.Add(2, "Bob");
      
      string jsonString;
      using (MemoryStream ms = new MemoryStream()) {
          //NB: DataContractJsonSerializer is in assembly System.Runtime.Serialization.dll - and others; http://stackoverflow.com/a/2682197/361842 
          DataContractJsonSerializer dcjs = new DataContractJsonSerializer(dictFriends.GetType());
          dcjs.WriteObject(ms, dictFriends);
      
          ms.Position = 0;
          using(StreamReader sr = new StreamReader(ms)) {
              jsonString = sr.ReadToEnd();
          }
      }
      
      Debug.WriteLine(jsonString);
      

      样本输出:

      [{"Key":1,"Value":"Alice"},{"Key":2,"Value":"Bob"}]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-02
        • 1970-01-01
        • 2012-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-04
        • 1970-01-01
        相关资源
        最近更新 更多