我有一个奇怪的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;})或将反序列化类型更改为数组或实现的类型一个集合接口(例如ICollection
,IList
),如List<T>
,可以从JSON数组反序列化。也可以将JsonArrayAttribute
添加到类型中以强制它从JSON数组反序列化。
答案 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>
。 recruitersMap
和jobsMap
都是嵌套的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; }
}