我看到了这个,但它对我没有帮助。
Deserializing an object with a Dictionary<string, object> property (Newtonsoft.Json)
我正在开发 WCF Restful 服务。我有复杂的 JSON。 我有以下数据契约(Contract)
[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"})或将反序列化类型更改为数组或实现集合接口(interface)的类型(例如 ICollection、IList) 就像可以从 JSON 数组反序列化的 List 一样。还可以将 JsonArrayAttribute 添加到类型中,以强制其从 JSON 数组进行反序列化。 路径“TimestampExtraInfoPackages[0].ExtraInfo”,第 1 行,位置 194。
解决方案:
感谢 Shiva、Brian 和 taffer。我使用了塔弗的建议,效果很好。看来我们不能使用 IDictionary。
我使用下面的方法来解决我的问题。
public List<KeyValuePair<string, string>> ExtraInfo { get; set; }
我尝试了下面的方法,但没有成功,并出现同样的错误。
public IDictionary<string, string>[] ExtraInfo { get; set; }
最佳答案
正如错误消息所示,传入 ExtraInfo
应该是一个 JSON 对象,但在您的示例中,它是一个包含带有 Key
的对象的 JSON 数组。和Value
属性。
使用预期的 JSON 字符串提供您的服务:
"ExtraInfo": {
"Key1": "value1",
"Key2": "value2"
}
或者将您的合约修改为数组或列表,以便它可以接受 JSON 数组:
[DataMember]
public KeyValuePair<string, string>[] ExtraInfo { get; set; }
关于c# - 当属性具有 IDictionary<string, string> 时反序列化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53936668/