C#和jSON无法正常工作。

3

需要一点帮助

我有一个json url,需要将每个项目放入for each循环中

这是json:

{
    "_links": { },
    "count": 9,
    "list": {
        "staff": [
            "staff1",
            "staff2",
            "staff3"
        ],
        "clients": [
            "client1",
            "client2",
            "client3",
            "client4",
            "client5",
            "client6"
        ]
    }
}

我也有以下C#代码,但一直收到错误提示。
string source;
var sURL = "LINK_TO_JSON_URL";
WebRequest req = HttpWebRequest.Create(sURL);
req.Method = "GET";
req.Timeout = 5000;
try
{
    using (StreamReader reader = new StreamReader(req.GetResponse().GetResponseStream()))
    {
        source = reader.ReadToEnd();
        reader.Close();
    }
    JToken jObject = JObject.Parse(source);
    string clients = (string)jObject["list"]["clients"];

    //for each loop here

}
catch (Exception ex)
{
    //error message here
}

我到底做错了什么?我尝试将字符串转换为数组,但仍然没有得到任何结果。我想要能够获取每个客户的姓名。
谢谢

3
你收到了哪些错误信息? - Hemi81
1
看起来 jObject["list"]["clients"] 应该是一个 JArray。你应该对其进行迭代,而不是将其转换为 string - crashmstr
你尝试过这个代码吗:string[] clients = jObject["list"]["clients"]; - sujith karivelil
你不能将jObject["list"]["clients"]强制转换为字符串或字符串数组,如果你们中的任何人实际尝试过这样做,你就会知道。将其强制转换为字符串数组是编译时错误。将其强制转换为字符串是运行时错误。我相信返回值是JToken而不是JArray。 - Trioj
(但您仍可以像crashmstr在下面的答案中所演示的那样遍历JToken,因为JToken是JArray的后代。) - Trioj
2个回答

4

下面是一些代码示例,展示如何遍历包含字符串的 JArray。这段代码已经使用您的 JSON 进行了测试,并输出每个客户端字符串。

var jObject = JObject.Parse(source);

foreach (var client in jObject["list"]["clients"])
{
    Console.WriteLine((string)client);
}

这实际上是正确的,从未试图将一个对象荒谬地转换为它不能转换的另一个对象。+1。 - Trioj
1
您真是个传奇。请收下我送的虚拟啤酒 :) - Steven Kiberton

0

看看这段代码

#region Model For Deserialize String to Object
    public class Links
    {
    }
    public class List
    {
        public List<string> staff { get; set; }
        public List<string> clients { get; set; }
    }
    public class RootObject
    {
        public Links _links { get; set; }
        public int count { get; set; }
        public List list { get; set; }
    }
    #endregion

    #region Restfull Respone (String) Convert To RootObject
    public class ConvertStringToObj
    {
        public void Execute()
        {
            //Your webReq and Response progress here
            string jsonResponse="";
            var rootObj = (RootObject)Newtonsoft.Json.JsonConvert.DeserializeObject(jsonResponse, typeof(RootObject));
            foreach(var eachItem in rootObj.list.staff)
            {
                var stafName = eachItem;
            }

        }
    }
    #endregion

这里有一个解决方案,你可以通过对象实现 :)

如果你打算这样做(有时比使用 JObject 更好),你应该使用 DeserializeObject<RootObject>,那么你就不需要强制转换或额外的参数了。 - crashmstr
是的,你说得对。但有些特殊情况需要使用 typeof(RootObject) 参数。特别是将字符串转换为 List<Object> 类型时。顺便说一下,我非常喜欢这个对象解决方案。因为一切都很清晰... - Eyup Can ARSLAN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接