仅从嵌套的JSON中检索电话号码数据

时间:2017-06-19 14:33:32

标签: c# json json.net

我正在尝试使用Newtonsoft dll从嵌套的JSON中检索数据(只是电话号码)。 Json(请求)看起来像这样:

[{
    "name": "sam",
    "age": 19,
    "Gender" : "F",
    "Email" : "sam@test.com",
    ...
    "PhoneNumber" :{
        "CCode":"1",
        "Area": "123",
        "PhoneNum": "456-789",
        "PhoneExtn": ""
     }
    ...
}]

我在中有更多的值,但我只需要电话号码,因此创建一个具有上述属性的自定义类并在上面的JSON字符串上使用 DeserializeObject 不是一个选项。但是,我确实尝试了以下选项:

dynamic jsonObj = JsonConvert.DeserializeObject(request);

var option1 = (string)jsonObj["PhoneNumber"]["CCode"];
var option2 = (string)jsonObj["PhoneNumber"][0]["CCode"];

//option3
 PhoneNumberModel phone = JsonConvert.DeserializeObject<PhoneNumberModel>(jsonObj["PhoneNumber"].ToObject<string>());

//option4 
PhoneNumberModel phone = JsonConvert.DeserializeObject<PhoneNumberModel>(jsonObj["PhoneNumber"][0].ToObject<string>());

获取以下例外情况:

1. Cannot apply indexing with [] to an expression of type for first three options
2. Accessed JObject values with invalid key value: 0. Object property name expected for option 4.

我尝试了许多在线解决方案但没有工作。我现在已经没有选择了。

3 个答案:

答案 0 :(得分:1)

只需定义您需要的属性即可。

public class Person
{
    [JsonProperty(PropertyName = "name")]
    public string Name { get; set; }

    [JsonProperty(PropertyName = "PhoneNumber")]
    public PhoneNumberModel { get; set; }
}

public class PhoneNumberModel
{
    public int CCode { get; set;}
    public int Area { get; set;}
    public string PhoneNum { get; set; }
    public string PhoneExtn { get; set; }
}

var person = JsonConvert.DeserializeObject<Person>(json);
var name = person.Name;
var phoneNumber = person.PhoneNumberModel;

答案 1 :(得分:0)

您是否尝试过使用JsonConvert.DeserializeObject<T>(string) API但是将整个请求发送给它?像这样:

PhoneNumberModel phone = JsonConvert.DeserializeObject<PhoneNumberModel>(request);

Newtonsoft会忽略目标类中缺少的属性。

答案 2 :(得分:0)

您可以将PhoneNumber添加到您的模型中:

PhoneNumberModel model =
    JArray.Parse(json)[0]
          .SelectToken("PhoneNumber")
          .ToObject<PhoneNumberModel>();

小提琴:https://dotnetfiddle.net/U21KfN