繁体   English   中英

解析来自 StreamBuilder C# 的 JSON 响应

[英]Parsing JSON response from StreamBuilder C#

我从另一个网站收到 JSON 响应,然后从 StreamReader 构建响应:-

using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
            response = streamReader.ReadToEnd();
}

我得到的结果是:-

string response = "{\"d\":\"[{\\\"Animal\\\":\\\"Cat\\\",\\\"Noise\\\":\\\"Meow\\\"},{\\\"Animal\\\":\\\"Dog\\\",\\\"Noise\\\":\\\"Woof\\\"}]\"}";

然后我使用 JsonConvert.DeserializeObject(response) 来反序列化,然后我试图遍历结果以读取值..但无论我尝试什么都不起作用

dynamic jObj = JsonConvert.DeserializeObject(response);
var arr = jObj; //Tried var arr = jObj.d;

@foreach (var item in arr)
{
 ….
}

错误目标类型 System.Collections.IEnumerable 不是值类型或非抽象类。 参数名称:targetType

您的 JSON 响应包含一个d属性,该值是一个包含在字符串本身中的数组。

因此,您应该将d内容单独解析为数组, Json.Linq解决方案如下

string response = "{\"d\":\"[{\\\"Animal\\\":\\\"Cat\\\",\\\"Noise\\\":\\\"Meow\\\"},{\\\"Animal\\\":\\\"Dog\\\",\\\"Noise\\\":\\\"Woof\\\"}]\"}";
var json = JObject.Parse(response);
var array = json["d"];

foreach (var item in JArray.Parse(array.ToString()))
{
    Console.WriteLine(item["Animal"]);
}

反序列化为dynamic对象的解决方案

dynamic json = JsonConvert.DeserializeObject(response);
var array = json?.d;

foreach (var item in JsonConvert.DeserializeObject(array?.ToString()))
{
    Console.WriteLine(item?.Animal);
}

它允许您在不更改源 JSON 的情况下解析响应

如果你打印response ,你会看到jObj.d不是一个数组,而是一个字符串。 事实上,它看起来像一个对象数组的字符串表示。

似乎“d”的值包含另一个 JSON 数据。 如果它是正确的并且您不想触及 JSON 格式,则解决方案如下:

    string response = "{\"d\":\"[{\\\"Animal\\\":\\\"Cat\\\",\\\"Noise\\\":\\\"Meow\\\"},{\\\"Animal\\\":\\\"Dog\\\",\\\"Noise\\\":\\\"Woof\\\"}]\"}";

    dynamic jObj = JsonConvert.DeserializeObject(response);

    var arr = JsonConvert.DeserializeObject<D[]>((jObj.d).Value);

    foreach (var item in arr)
    {

    }

     ........

    public class D
    {
        public string Animal { get; set; }
        public string Noise { get; set; }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM