[英]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.