如何在C#中解析JSON

时间:2015-09-07 11:22:36

标签: c# json windows-phone-8.1 json.net

我有一个奇怪的JSON字符串需要在C#中解析。我该怎么做。我尝试将其解析为Dictionary,但失败了。我可以以某种方式创建一个hashmap吗?

Dictionary<string, string> values = JsonConvert.DeserializeObject<Dictionary<string, string>>(response);

JSON字符串为here

我使用API​​获取此数据。这是我收到的错误。

  

无法将当前JSON数组(例如[1,2,3])反序列化为类型System.Collections.Generic.Dictionary`2 [System.String,System.String]&#39;因为该类型需要一个JSON对象(例如{&#34; name&#34;:&#34; value&#34;})才能正确反序列化。

要修复此错误,请将JSON更改为JSON对象(例如{&#34; name&#34;:&#34; value&#34;})或将反序列化类型更改为数组或实现的类型一个集合接口(例如ICollectionIList),如List<T>,可以从JSON数组反序列化。也可以将JsonArrayAttribute添加到类型中以强制它从JSON数组反序列化。

3 个答案:

答案 0 :(得分:4)

您的JSON数据的形状将不适合Dictionary<string,string>,因为在其顶层,它不是字典。这是一组对象。

您需要编写与数据形状匹配的自定义类型(class),然后反序列化为此类型的集合。

所以,从广义上讲(使用未经测试的代码......)

public class SomeType
{
    public string notificationId{ get; set; }
    //etc
    public Dictionary<string,string> recruitersMap{ get; set; }
    //etc
}

然后

JsonConvert.Deserialize<List<SomeType>>(someJson)

答案 1 :(得分:1)

这是因为您的JSON不代表Dictionary<string, string>recruitersMapjobsMap都是嵌套的object或集合,而不是string s。

你可以创建一个POCO类

    public class ApiEndPoint // you will find a better name, I'm sure
    {
        public string notificationId { get; set; }
        public string readFlag { get; set; }
        public string importantFlag { get; set; }
        public string subject { get; set; }
        public string folder { get; set; }
        public DateTime creationTime { get; set; }
        public int notificationCount { get; set; }
        public string jobId { get; set; }
        public Dictionary<string, string> recruitersMap { get; set; }
        public Dictionary<string, string> jobsMap { get; set; }
    }

并将json反序列化为该类的对象,如下所示:

JsonConvert.DeserializeObject<List<ApiEndPoint>>(yourJsonString);

答案 2 :(得分:0)

我看到你指出的JSON有一个规则的结构,你应该为它创建一个包装模型,参见下面的例子,或者在https://dotnetfiddle.net/TGWTNC中使用它。

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


public class Program
{
    public static void Main(string[] args)
    {

        var webClient = new WebClient();
        var json = webClient.DownloadString("https://gist.githubusercontent.com/maskaravivek/33aa0d6556bbb9ecb77a/raw/b815daa55719a754eef5117321e2c0c5621c6a18/gistfile1.txt");
        var notifications = JsonConvert.DeserializeObject<Notification[]>(json);

        Console.WriteLine(notifications.Count());
        Console.ReadLine();
    }
}

//adjust the data types according to your needs
public class Notification
{
    public string notificationId { get; set; }
    public string readFlag { get; set; }
    public string importantFlag { get; set; }
    public string subject { get; set; }
    public string folder { get; set; }
    public string creationTime { get; set; }
    public string notificationCount { get; set; }
    public string jobId { get; set; }
    public Dictionary<string, string> recruitersMap { get; set; }
    public Dictionary<string, string> jobsMap { get; set; }
}