我从返回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'到'字符串'
我想帮助将返回的数据放入模型中的变量中。
这是我的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"
},
答案 0 :(得分:5)
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);
答案 1 :(得分:1)
这里是如何获取JToken和JArray作为字符串的示例。
使用Formatting.None进行简单格式化。
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);
}
答案 2 :(得分:0)
您可以将这些类模型添加到您的应用程序中,并将json反序列化为它,您可以使用各种类型的deseriallizers,我个人喜欢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的响应并访问city属性
答案 3 :(得分:0)
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"
}