简体   繁体   中英

How to de-serialize a json object containing variable number of objects and get them as a key value collection in C#?

How can I deserialize the following JSON object and get a collection of Dictionary where the key(string) should be the method name and the object the details in C#.

{
"methods": {
    "password.2": {
      "title": "Password CustomerID",
      "type": "password"
    },
    "ubikey.sms.1": {
      "title": "SMS",
      "type": "stepup",
      "password": "password.2",
      "stepUp": "sms"
    },
    "tupas.test.1": {
      "title": "TUPAS Emulator",
      "type": "proxy"
    }
  }
}

If it was an array of methods, I could have easily serialized it using an array. But since that itself is a key value pair, I'm stuck.

I'm making an WebRequest to a particular api and getting the result as a json.

The code used to serialize the object is from https://msdn.microsoft.com/en-us/library/hh674188.aspx

JSON.net does this:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Newtonsoft.Json;

namespace ConsoleApplication1
{
    class Program
    {

        static void Main(string[] args)
        {
            string json = @"{
""methods"": {
    ""password.2"": {
      ""title"": ""Password CustomerID"",
      ""type"": ""password""
    },
    ""ubikey.sms.1"": {
      ""title"": ""SMS"",
      ""type"": ""stepup"",
      ""password"": ""password.2"",
      ""stepUp"": ""sms""
    },
    ""tupas.test.1"": {
      ""title"": ""TUPAS Emulator"",
      ""type"": ""proxy""
    }
  }
}";

            Dictionary<string, Dictionary<String,Dictionary<String,String>>> values = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<String,Dictionary<String,String>>>>(json);
        }


    }
}

The page you linked to describes how to use DataContractJsonSerializer to deserialize JSON. You can use that serializer to deserialize your "methods" object as a Dictionary , provided you are using .Net 4.5 or later and also set DataContractJsonSerializerSettings.UseSimpleDictionaryFormat = true . Having done this, you can define the following classes:

public class Method
{
    public string title { get; set; }
    public string type { get; set; }
    public string password { get; set; }
    public string stepUp { get; set; }
}

public class Response
{
    public Dictionary<string, Method> methods { get; set; }
}

And parse them as follows:

        var settings = new DataContractJsonSerializerSettings { UseSimpleDictionaryFormat = true };
        var jsonSerializer = new DataContractJsonSerializer(typeof(Response), settings);
        var jsonResponse = jsonSerializer.ReadObject(response.GetResponseStream()) as Response;

If you are using an earlier version of .Net, you may need to use a different serializer such as Json.NET , since, in earlier versions, DataContractJsonSerializer serializes dictionaries as key/value pair arrays .

 dynamic results = JsonConvert.DeserializeObject(JsonString());
 Dictionary<string, object> dictionary = new Dictionary<string, object>();
 foreach (var o in results.methods)
 {
     dictionary[o.Name] = o.Value;
 }

private static string JsonString()
{
         return "{\"methods\": {\"password.2\": {\"title\": \"Password CustomerID\",\"type\": \"password\"},\"ubikey.sms.1\": {\"title\": \"SMS\",\"type\": \"stepup\",\"password\": \"password.2\",\"stepUp\": \"sms\"},\"tupas.test.1\": {\"title\": \"TUPAS Emulator\",\"type\": \"proxy\"}}}";
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM