如何从JToken获取字符串值

7 c# model-view-controller json json.net

我正在从返回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
Run Code Online (Sandbox Code Playgroud)

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

无法将类型'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"
},
Run Code Online (Sandbox Code Playgroud)

Bri*_*ers 7

JSON表示一个包含对象data数组的外部对象,每个项目均包含一个address_obj具有字符串属性的对象。因此,JToken您使用的索引器语法必须匹配该层次结构,包括使用正确的属性名称。另外,从a检索值时,JToken需要将其转换为正确的类型。

您可以这样获得城市,i您想要的位置的索引在哪里:

l.city = (string)obj["data"][i]["address_obj"]["city"];
Run Code Online (Sandbox Code Playgroud)

但是,如果您要做的只是填充模型对象,那么直接将序列化反序列化到使用的对象可能会比使用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; }
}
Run Code Online (Sandbox Code Playgroud)

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

RootObject obj = JsonConvert.DeserializeObject<RootObject>(result);
Run Code Online (Sandbox Code Playgroud)


liv*_*ove 5

以下是如何以字符串形式获取 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);
    }
Run Code Online (Sandbox Code Playgroud)