Я видел это, но это не помогает мне.
Десериализация объекта с помощью словарясвойство (Newtonsoft.Json)
Я работаю на WCF Restful службы.У меня сложный JSON.У меня ниже контракты данных
[DataContract]
public class TimestampPackageDC
{
[DataMember]
public string Timestamp { get; set; }
[DataMember]
public string Company { get; set; }
[DataMember]
public string ContactID { get; set; }
[DataMember]
public string Area { get; set; }
[DataMember]
public string PackageID { get; set; }
} // end of class TimestampPackageDC
[DataContract]
public class TimestampPackageExtraDC: TimestampPackageDC
{
[DataMember]
public IDictionary<string, string> ExtraInfo { get; set; }
} // end of class TimestampPackageExtraDC
[DataContract]
public class GetAllUnprintedItemsResponse: BaseResponse
{
[DataMember]
public TimestampPackageDC[] TimestampPackages { get; set; }
[DataMember]
public TimestampPackageExtraDC[] TimestampExtraInfoPackages { get; set; }
}
Я делаю вызов службы REST, как показано ниже
GetAllUnprintedItemsResponse upResponse = new GetAllUnprintedItemsResponse();
Request upRequest = new Request() { Name = "abc" };
string url = "http://localhost:2023/myservice/getdata";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/json";
byte[] data = Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(upRequest));
request.ContentLength = data.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(data, 0, data.Length);
requestStream.Close();
WebResponse response = request.GetResponse();
Stream respStream = response.GetResponseStream();
StreamReader reader = new StreamReader(respStream);
string responseData = reader.ReadToEnd();
//getting error below
Newtonsoft.Json.JsonConvert.PopulateObject(responseData, upResponse);
Я получаю строку JSON, как показано ниже
{
"DocumentException": null,
"Success": true,
"TimestampExtraInfoPackages": [{
"Area ": "AA",
"Company": "XXX",
"ContactID": "123",
"PackageID": "P1",
"Timestamp": "20090501163433360001",
"ExtraInfo": [{
"Key": "Key1",
"Value": "value1"
},
{
"Key": "Key2",
"Value": "value2"
}
]
}],
"TimestampPackages": []
}
Ниже приведенЯ получаю сообщение об ошибке
Невозможно десериализовать текущий массив JSON (например, [1,2,3]) в тип 'System.Collections.Generic.IDictionary`2 [System.String, System.String]'потому что тип требует JSON-объект (например, {"name": "value"}) для правильной десериализации.Чтобы исправить эту ошибку, либо измените JSON на объект JSON (например, {"name": "value"}), либо измените десериализованный тип на массив или тип, который реализует интерфейс коллекции (например, ICollection, IList), например List, который можетбыть десериализованным из массива JSON.JsonArrayAttribute также может быть добавлен к типу, чтобы принудительно десериализовать его из массива JSON.Путь TimestampExtraInfoPackages [0] .ExtraInfo, строка 1, позиция 194.
РЕШЕНИЕ:
Благодаря Шиве, Брайану и Тафферу.Я использовал совет Таффера, и это сработало.Похоже, мы не можем использовать IDictionary.
Я использовал ниже, чтобы решить мою проблему.
public List<KeyValuePair<string, string>> ExtraInfo { get; set; }
Я попытался ниже, но не работает, получил ту же ошибку.
public IDictionary<string, string>[] ExtraInfo { get; set; }