代码之家  ›  专栏  ›  技术社区  ›  AWooster

JSON中的C#Rest响应反序列化到自定义对象

  •  0
  • AWooster  · 技术社区  · 6 年前

    我已经复习了很多关于这个问题的帖子,但仍然有问题。我正在使用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创建对象,然后简单地反序列化,但它说@搜索.score“也是无效的”@odata.context文件". 在我注释掉C代码中的那些行之后,它没有正确地反序列化(所有内容都为空),我需要能够检索客户信息并将其分配给我的自定义类。

    2 回复  |  直到 6 年前
        1
  •  4
  •   Woody1193 Nimmi Rashinika    6 年前

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

    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 如果你的名字不匹配,比如你想要一个特定的命名风格。

        2
  •  3
  •   Woody1193 Nimmi Rashinika    6 年前

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

    Newtonsoft.Json.JsonConvert.Deserialize<Class>(responseJson) .

    注意,newtonsoft的json属性默认为camel大小写。由于属性不是大小写,因此需要显式定义属性名称。

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