如何从JToken中获取字符串值



我正在从返回JSON响应的web服务获取数据。这是我的代码:

WebClient client = new WebClient();
var result =  client.DownloadString("http://some url");
    
JObject obj = JObject.Parse(result);
// Location l = new Location();
//   l.city = obj["ad"][2]; error here

在这一点上,它返回了一个结果,但我得到了一个错误:

无法将类型"Newtonsoft.Json.Linq.JToken"隐式转换为"string"

我希望得到一些帮助,将返回的数据放入模型中的变量中。

这是我的JSON:

{
  data: [
  {
    address_obj: {
    street1: "9518 Front Beach Road",
    street2: "",
    city: "Panama City Beach",
    state: "Florida",
    country: "United States",
    postalcode: "32407",
    address_string: "9518 Front Beach Road, Panama City Beach, FL 32407"
  },
JSON表示一个包含对象的data数组的外部对象,每个项包含一个address_obj对象,然后该对象具有字符串属性。因此,您使用的JToken索引器语法必须与该层次结构相匹配,包括使用正确的属性名称。此外,从JToken检索值时,需要将其强制转换为正确的类型。

你可以得到这样的城市,其中i是你想要的位置的索引:

l.city = (string)obj["data"][i]["address_obj"]["city"];

然而,如果您所做的只是填充模型对象,那么直接反序列化到使用JsonConvert.DeserializeObject<T>的对象可能比使用JTokens手动填充模型对象更简单。例如,如果您的类定义如下:

public class RootObject
{
    [JsonProperty("data")]
    public List<Item> Data { get; set; }
}
public class Item
{
    [JsonProperty("address_obj")]
    public Location Location { get; set; }
}
public class Location
{
    [JsonProperty("street1")]
    public string Street1 { get; set; }
    [JsonProperty("street2")]
    public string Street2 { get; set; }
    [JsonProperty("city")]
    public string City { get; set; }
    [JsonProperty("state")]
    public string State { get; set; }
    [JsonProperty("country")]
    public string Country { get; set; }
    [JsonProperty("postalcode")]
    public string PostalCode { get; set; }
    [JsonProperty("address_string")]
    public string FullAddress { get; set; }
}

然后你可以像这样直接反序列化到它们:

RootObject obj = JsonConvert.DeserializeObject<RootObject>(result);

下面是一个如何将JToken和JArray作为字符串获取的示例。

使用格式设置。无用于简单格式设置。

string json = "["a", null, "b", null, null, null, 0,[],[["c"], null,[0],["d"]]]";
    JArray array = JArray.Parse(json);
    // array string
    string arrayStr = array.ToString(Newtonsoft.Json.Formatting.None);
    for (int i = 0; i < array.Count; i++)
    {
        JToken elem = array[i];
        // token string
        string jtokenStr = elem.ToString(Newtonsoft.Json.Formatting.None);
    }

你可以将这些类模型添加到你的应用程序中,并将json反序列化到它中,你可以使用各种类型的反序列化器,我个人喜欢newtonsoft的json.net,下面是类:

public class AddressObj
{
    public string street1 { get; set; }
    public string street2 { get; set; }
    public string city { get; set; }
    public string state { get; set; }
    public string country { get; set; }
    public string postalcode { get; set; }
    public string address_string { get; set; }
}
public class Datum
{
    public AddressObj address_obj { get; set; }
}
public class RootObject
{
    public List<Datum> data { get; set; }
}

之后,反序列化对AddressObj的响应并访问城市属性

public class DataObj
{
    [JsonProperty("prop_1")]
    public string Prop1{ get; set; }
}
//Select is from Linq
var data = e.details.Select(a => a.ToObject<DataObj>()); // e.details is a JArray
 //json is like -----
{
   "prop_1": "text"
}

相关内容

  • 没有找到相关文章

最新更新