我已经审查了很多有关此问题的帖子,但仍然遇到麻烦。我正在使用Newtonsoft.Json和以下代码:
string url = @"https://https://someSite.com/indexes('myIndex')search=SEARCH_PHONES:";
string phoneNumber = "5550005555";
url += phoneNumber;
HttpWebRequest request = HttpWebRequest.CreateHttp(url);
request.Method = "GET";
request.Headers.Add("api-key", "####");
WebResponse response = request.GetResponse();
Stream imageStream = response.GetResponseStream();
Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
StreamReader readStream = new StreamReader(imageStream, encode);
string s = readStream.ReadToEnd();
JObject joResponse = JObject.Parse(s);
JArray array = (JArray)joResponse["value"];
string customer = array[0].ToString();
问题是数组以一个长字符串形式返回。如何访问单个键/值对?以下是我收到的回复:
{
"@odata.context": "https://someSite.com/indexes('myIndex')/$metadata#docs",
"value": [
{
"@search.score": 10.933167,
"CUSTOMER_DIM_ID": "77049309",
"SOURCE_CUSTOMER_ID": null,
"PORTSTORE_ID": "0326_1448401",
"FIRST_NM": "First Name",
"LAST_NM": "Last Name",
"ADDR_LINE_1": "133 Main St",
"ADDR_LINE_2": null,
"CITY": "MyCity",
"STATE_CD": "IL",
"POSTAL_CD": "99999",
"COUNTRY": "United States",
"EMAIL_ADDR": "myEmail@gmail.com",
"BIRTH_DT": null,
"PHONE": "5550005555",
"GENDER_CD": "F",
"SEARCH_EMAILS": [
"myEmail@gmail.com"
],
"SEARCH_PHONES": [
"5550005555"
],
"JUS_EMAIL_OPTIN": true,
"JCA_EMAIL_OPTIN": true,
"LCA_EMAIL_OPTIN": true,
"JUS_DM_OPTIN": true,
"JCA_DM_OPTIN": true,
"LCA_DM_OPTIN": true,
"MOBILE_OPTIN": false,
"LIFETIME_REVENUE": "138.1800",
"LIFETIME_UNITS": 7,
"NTH_ORDER": 2,
"FIRST_PURCHASE_DT": "2016-02-11T00:00:00Z",
"LAST_PURCHASE_DT": "2016-02-19T00:00:00Z",
"AVG_LAG": 8,
"IsDeleted": false,
"UPDATE_DT": "2016-02-19T00:00:00Z"
}
]
}
我无权更改回复。我试图使用json2sharp创建对象,然后简单地反序列化,但是它说“ @ search.score”和“ @ odata.context”都是无效的。在我用C#代码注释掉这些行之后,它无法正确反序列化(一切都为空),我需要能够检索客户信息并将其分配给我的自定义类。
答案 0 :(得分:4)
您似乎在这里做了一些额外的工作。代替
Stream imageStream = response.GetResponseStream();
Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
StreamReader readStream = new StreamReader(imageStream, encode);
string s = readStream.ReadToEnd();
执行string s = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
然后,您可以做一个JsonConvert.DeserializeObject<MyType>(s)
,那样您就可以找到您的对象。
例如,如果您想要特定的命名样式,请在您的对象中确保名称不匹配的地方使用适当的serialization attributes。
答案 1 :(得分:3)
除非有充分的理由,否则请不要通过JSON手动解析。
使用您选择的其他客户端(postman / dhcp / etc。)发出Web请求,然后复制响应。然后创建一个新的.cs文件,并转到“编辑”->“以前的特殊情况”->“粘贴Json”作为类。
从这里,您应该会得到一个可以正常工作的POCO,可以使用Newtonsoft.Json.JsonConvert.Deserialize<Class>(responseJson)
来反序列化JSON。
请注意,对于json属性,newtonsoft默认为驼峰式。由于您的属性不是驼峰大小写,因此您需要显式定义属性名称。
[JsonProperty("ID")]
public int ID { get; set; }