frc
frc

Reputation: 588

dictionary to json with key names

I have a dictionary Dictionary<int, string> of ints and strings, where ints are ids and strings are usernames, and when I convert it to JSON using Json.NET I get something like the following:

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

I convert it like so:

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

But I am hoping to get something like so:

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

Is it possible?

Upvotes: 3

Views: 7963

Answers (3)

JohnLBevan
JohnLBevan

Reputation: 24430

You could use the DataContractJsonSerializer: https://msdn.microsoft.com/en-us/library/system.runtime.serialization.json.datacontractjsonserializer(v=vs.110).aspx

The below will produce output in the form you're after; only instead of id and user your fields would be named key and value. The reason being those are the property names on the dictionary.

If you needed to change those names also (i.e. it's not just the structure you're interested in), you'd need to override the dictionary with a custom class, where you could add attributes such as [JsonProperty(PropertyName = "User")] to the properties to change how they're parsed... See http://www.newtonsoft.com/json/help/html/SerializationAttributes.htm for more.

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

Sample output:

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

Upvotes: 0

Leon Storey
Leon Storey

Reputation: 3424

You're trying to use a Dictionary as an Array/List, writing to an existing key will overwrite it. Also your current key type is int therefore you would have JSON output such as

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

Instead set your object type to 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);

Upvotes: 0

Equalsk
Equalsk

Reputation: 8194

As far as I know you'd have to transform the dictionary into something JSON.NET would recognise as being an 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);

Output:

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

Upvotes: 4

Related Questions