C# 在ASP.NET C中读取JSON数据#
我试图检索存储在JSON字符串中的值,该字符串是我使用Newtonsoft.JSON从网站获取的 我有下面的代码,但我无法解决如何循环数据以检索调色板->线程->名称部分中的名称标记。线程名称的数量可能从1到15不等 下面代码的预期结果是输出如下内容 使用的颜色:黑色、浅蓝色、白色等 任何帮助都将不胜感激,我已经绞尽脑汁看了其他人的例子,但我在应用字典或列表方面没有运气(我仍在学习.net)C# 在ASP.NET C中读取JSON数据#,c#,asp.net,json,json.net,C#,Asp.net,Json,Json.net,我试图检索存储在JSON字符串中的值,该字符串是我使用Newtonsoft.JSON从网站获取的 我有下面的代码,但我无法解决如何循环数据以检索调色板->线程->名称部分中的名称标记。线程名称的数量可能从1到15不等 下面代码的预期结果是输出如下内容 使用的颜色:黑色、浅蓝色、白色等 任何帮助都将不胜感激,我已经绞尽脑汁看了其他人的例子,但我在应用字典或列表方面没有运气(我仍在学习.net) 您应该按照以下方式对JsonClass建模,并添加线程等: public class JsonClass
您应该按照以下方式对
JsonClass
建模,并添加线程等:
public class JsonClass
{
public int Width { get; set; }
public int Height { get; set; }
public int NumStitches { get; set; }
public Palette Palette { get; set; }
}
public class Palette
{
public IEnumerable<Thread> Threads { get; set; }
}
public class Thread
{
public string Name { get; set;}
...
}
使用JSON.NET内置LINQ to JSON提供程序的解决方案:
JObject jObject = JObject.Parse(jsondata);
JArray threads = (JArray)jObject["Palette"]["Threads"];
var colorsUsed = new StringBuilder();
colorsUsed.Append("Colours used: ");
foreach (var thread in threads)
{
colorsUsed.AppendFormat("{0}, ", thread["Name"]);
}
Response.Write(colorsUsed);
使用以下模型反序列化json
public class Palette
{
public List<Thread> Threads { get; set; }
}
public class Thread
{
public string Name { get; set; }
public string Manufacturer { get; set; }
public string Code { get; set; }
public int Red { get; set; }
public int Green { get; set; }
public int Blue { get; set; }
public string Type { get; set; }
public int Thickness { get; set; }
}
public class Colors
{
public int Width { get; set; }
public int Height { get; set; }
public int NumStitches { get; set; }
public Palette Palette { get; set; }
public List<int> Needles { get; set; }
}
将Json映射到类时,一个方便的提示是安装,因为它有一个名为“将Json粘贴为类”的东西。您只需复制json字符串并粘贴到VisualStudio中,然后VisualStudio就会为您创建匹配的类。您使用的是什么版本的net framework?尝试使用“动态”而不是对象
公共动态调色板{get;set;}
您将能够在运行时访问任何属性。@TimBJames,谢谢您的建议@ViktorArsanov我也发现了这个例子,但我使用的是v2,它不起作用:(这是我尝试尝试的,但无法解决的问题!但我在这方面又遇到了一个问题,当我添加foreach循环时,“thread”一词的下划线不规则,并警告“找不到类型或命名空间名称“thread”(是否缺少using指令或程序集引用?)@Chris抱歉,我无法想象你的问题是什么。我已经完全尝试了我的代码,它成功了。你的foreach循环是否与我的示例中的完全相同?你可能有其他类似的引用吗?如果你将线程
重命名为例如myTempVariable
,会发生什么?谢谢Kevin,你的答案现在就起作用了!够有趣的,tBruceWayne的另一个回复与您的回复类似,但也有同样的问题,foreach循环中缺少了“var”一词,这使它无法运行。我尝试使用“string”,但它说计算机没有,我没想到要使用var。@Chris,Kevin犯了我修复的相同的小技术错误(缺少var),但您应该慢慢地学会修复代码中的此类打字错误或小的不规则之处,而不是询问它为什么不起作用。显然,线程不能是字符串,因为您正在迭代thread类型的对象集合。因此,简单地说,对于Threads集合中thread类型的每个对象->do this.Var是一个keyword,让编译器决定用什么替换它,在这种情况下,它知道这些是线程对象,但您也可以简单地在那里写“Thread Thread in pal.Threads”。这看起来很容易理解,但我得到的错误与上面的另一个示例相同。“Thread”一词的下划线不规则,带有警告“找不到类型或命名空间名称‘thread’(是否缺少using指令或程序集引用?)”太好了!非常感谢。它说我无法投票,因为我刚刚加入!
foreach (var thread in pal.Threads)
{
Response.Write(thread.Name + ", ");
}
JObject jObject = JObject.Parse(jsondata);
JArray threads = (JArray)jObject["Palette"]["Threads"];
var colorsUsed = new StringBuilder();
colorsUsed.Append("Colours used: ");
foreach (var thread in threads)
{
colorsUsed.AppendFormat("{0}, ", thread["Name"]);
}
Response.Write(colorsUsed);
public class Palette
{
public List<Thread> Threads { get; set; }
}
public class Thread
{
public string Name { get; set; }
public string Manufacturer { get; set; }
public string Code { get; set; }
public int Red { get; set; }
public int Green { get; set; }
public int Blue { get; set; }
public string Type { get; set; }
public int Thickness { get; set; }
}
public class Colors
{
public int Width { get; set; }
public int Height { get; set; }
public int NumStitches { get; set; }
public Palette Palette { get; set; }
public List<int> Needles { get; set; }
}
var output = JsonConvert.DeserializeObject<Colors>(jsondata);
foreach(var thread in output.Palette.Threads){
//something like you wanted
Response.Write(thread.Name + ",");
}