【问题标题】:C# Rest Response in JSON Deserialize to Custom ObjectJSON 中的 C# Rest 响应反序列化为自定义对象
【发布时间】:2018-08-30 15:14:10
【问题描述】:

我已经查看了很多关于这个问题的帖子,但我仍然遇到问题。我正在使用 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# 代码中注释掉这些行之后,它没有正确反序列化(一切都是空的)我需要能够检索客户信息并将其分配给我的自定义类。

【问题讨论】:

    标签: c# json rest


    【解决方案1】:

    看起来你在这里做了一些额外的工作。而不是

    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,例如,如果您想要特定的命名风格。

    【讨论】:

    • 我用你的代码替换了我的代码,但它说 WebResponse 不包含 Content 的定义
    • 我没有简化我的代码,但我能够反序列化为我的对象,感谢 Woody1193 和 @Fikse 的快速和非常有用的响应!
    • @AWooster 我很抱歉。我没有看到您使用的是HttpWebResponse,而是HttpResponseMessage。如果您使用的是 .NET 4.5 或更高版本,我建议您转到使用 HttpRequest/ResponseHttpClient,因为它们是异步的。请参阅此内容以供参考:stackoverflow.com/questions/21445731/…
    【解决方案2】:

    除非有充分的理由,否则不要手动解析 JSON。

    使用您选择的 REST 客户端(postman/dhcp/etc.)发出 Web 请求并复制响应。然后创建一个新的 .cs 文件并转到 Edit -> Past Special -> Paste Json as class。

    从这里你应该得到一个主要工作的 POCO,它可以用于使用 Newtonsoft.Json.JsonConvert.Deserialize<Class>(responseJson) 反序列化 JSON。

    请注意,newtonsoft 默认为 json 属性的驼峰式大小写。由于您的属性不是驼峰式大小写,因此您需要明确定义属性名称。

    [JsonProperty("ID")]
    public int ID { get; set; }
    

    【讨论】:

    • 这也很有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多