我似乎无法正确地找到一个原始对象来向Web服务添加数据。有人能够帮助我修复我的语法,或解释我应该如何做到这一点吗?
我收到了一份我要发送到网络服务进行处理的地址列表。地址列表还可以包含应保留的0到多个未知列,但不会发送到Web服务,因此我使用动态类型,这允许我保留所有未知行并轻松添加数据从网络服务回来。这就是数据如何进入服务器端的处理程序:
dynamic userAddresses = JsonConvert.DeserializeObject(json);
反序列化后userAddresses对象的一个简单示例如下所示:
{
"Addresses": [
{
"id": "",
"address": "1 Royal Way",
"city": "Kansas City",
"state": "MO",
"zipcode": ""
}
]
}
对于传入的json字符串,如下所示:
"{\"Addresses\":[{\"id\":\"\",\"address\":\"1 Royal Way\",\"city\":\"Kansas City\",\"state\":\"MO\",\"zipcode\":\"\"}]}"
然后我以线程方式一次向Web服务发送500个地址。我已经把结果拿回来了,我一直试图找到原始项目。所以我得到的Web服务结果将在响应变量中。两者都有一个必须是唯一的id字段。这就是我到目前为止所做的,但我正在为e。
获取一个未知类型的变量foreach (var response in webServiceResponses)
{
dynamic request = userAddresses.Addresses.Find(e => e.id == response.id); // Error on e.id
// Now enhance original request with addition data return by web service
}
在我搜索答案时,我遇到了Zip的Linq函数,如果它适用于动态类型,这可能是更好的方法。
答案 0 :(得分:1)
我会完全转储dynamic
个对象;它增加了不必要的复杂我会将json字符串反序列化为一个匿名类型数组,如下所示:
var userAddresses =
JObject
.Parse(json)["Addresses"]
.Select(x => new {
Id = Int32.Parse(x["id"].ToString()),
Properties =
x
.OfType<JProperty>()
.Where(y => y.Name != "id")
.Select(y => new { y.Name, Value = y.Value.ToString() })
});
这将为您提供一个如下所示的数组匿名类型:
{
"Id":1,
"Properties":[
{
"Name":"address",
"Value":"1 Royal Way"
},
{
"Name":"city",
"Value":"Kansas City"
},
{
"Name":"state",
"Value":"MO"
},
{
"Name":"zipcode",
"Value":""
}
]
}
然后你可以将你的回答与这样的回答配对:
var pairs =
webServiceResponses
.Join(
userAddresses,
response => response.Id,
address => address.Id,
(response, address) => new { Response = response, Address = address });
现在你可以按照自己喜欢的方式操作这些。
试试这个课:
public class UserAddress
{
public int Id { get; set; }
public Dictionary<string, string> Properties { get; set; }
}
使用此代码(稍微修改一下):
IEnumerable<UserAddress> userAddresses =
JObject
.Parse(json)["Addresses"]
.Select(x => new UserAddress()
{
Id = Int32.Parse(x["id"].ToString()),
Properties =
x
.OfType<JProperty>()
.Where(y => y.Name != "id")
.ToDictionary(y => y.Name, y => y.Value.ToString())
});
var pairs =
webServiceResponses
.Join(
userAddresses,
response => response.Id,
address => address.Id,
(response, address) => new { Response = response, Address = address });
foreach (var pair in pairs)
{
// Add each key\value pair in pair.Response to pair.Address.Properties.
}