c# - 当属性具有 IDictionary<string, string> 时反序列化对象

标签 c# json.net deserialization

我看到了这个,但它对我没有帮助。

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/

相关文章:

c# - 内部连接 ​​4 个表 mysql C#

c# - JObject如何读取数组中的值?

java - 如何创建TBase类实例

c# - 远程端点请求的确认地址与应用程序消息的地址不同

c# - 将引用传递给集合元素

c# - 如何让 C# 中的 notifyicon 在两个图标之间交替?

c# - 在使用 JSON.NET 反序列化之前从 JSON 中删除非法字符

c# - Json.NET Schema IsValid 即使类型不同也返回 true

c# - JSON反序列化。

c# - 从 XML 填充类对象