【问题标题】:Reading JSON data in ASP.NET C#在 ASP.NET C# 中读取 JSON 数据
【发布时间】:2014-09-09 13:43:08
【问题描述】:

我正在尝试检索存储在我使用 Newtonsoft.Json 从网站获取的 JSON 字符串中的值。

我有下面的代码,但我不知道如何遍历数据以检索 Palette->Threads->Name 部分中的 Name 标签。线程名称的数量可能从 1 到 15 不等。

下面代码的期望结果是输出类似 使用颜色:黑色、浅蓝色、白色等

任何帮助将不胜感激,我绞尽脑汁查看其他人的示例,但我在应用字典或列表方面没有运气(我仍在学习 .net)

protected void Page_Load(object sender, EventArgs e)
        {
            string jsondata = "{\"Width\":295,\"Height\":329,\"NumStitches\":1596,\"NumTrims\":1,\"Left\":479,\"Top\":-868,\"Right\":775,\"Bottom\":-539,\"Recipe\":\"Normal\",\"MachineFormat\":\"Tajima\",\"MasterDensity\":40,\"Palette\":{\"Threads\":[{\"Name\":\"Black\",\"Manufacturer\":\"Madeira 40\",\"Code\":\"1000\",\"Red\":0,\"Green\":0,\"Blue\":0,\"Type\":\"ttRayon\",\"Thickness\":3},{\"Name\":\"Light Blue\",\"Manufacturer\":\"Madeira 40\",\"Code\":\"1029\",\"Red\":0,\"Green\":114,\"Blue\":207,\"Type\":\"ttRayon\",\"Thickness\":3},{\"Name\":\"White\",\"Manufacturer\":\"Madeira 40\",\"Code\":\"1001\",\"Red\":255,\"Green\":255,\"Blue\":255,\"Type\":\"ttRayon\",\"Thickness\":3},{\"Name\":\"Mustard Brown\",\"Manufacturer\":\"Madeira 40\",\"Code\":\"1165\",\"Red\":255,\"Green\":153,\"Blue\":51,\"Type\":\"ttCotton\",\"Thickness\":3},{\"Name\":\"Midnight Blue\",\"Manufacturer\":\"Madeira 40\",\"Code\":\"1242\",\"Red\":0,\"Green\":40,\"Blue\":120,\"Type\":\"ttCotton\",\"Thickness\":3},{\"Name\":\"Jungle Green\",\"Manufacturer\":\"Madeira 40\",\"Code\":\"1249\",\"Red\":0,\"Green\":204,\"Blue\":0,\"Type\":\"ttCotton\",\"Thickness\":3},{\"Name\":\"Robin Egg Blue\",\"Manufacturer\":\"Madeira 40\",\"Code\":\"1093\",\"Red\":0,\"Green\":255,\"Blue\":255,\"Type\":\"ttCotton\",\"Thickness\":3},{\"Name\":\"Hyacinth\",\"Manufacturer\":\"Madeira 40\",\"Code\":\"1112\",\"Red\":125,\"Green\":0,\"Blue\":153,\"Type\":\"ttCotton\",\"Thickness\":3},{\"Name\":\"Aztec Gold\",\"Manufacturer\":\"Madeira 40\",\"Code\":\"1125\",\"Red\":255,\"Green\":240,\"Blue\":51,\"Type\":\"ttCotton\",\"Thickness\":3},{\"Name\":\"Evergreen\",\"Manufacturer\":\"Madeira 40\",\"Code\":\"1303\",\"Red\":0,\"Green\":73,\"Blue\":51,\"Type\":\"ttCotton\",\"Thickness\":3},{\"Name\":\"Lilac\",\"Manufacturer\":\"Madeira 40\",\"Code\":\"1033\",\"Red\":153,\"Green\":0,\"Blue\":153,\"Type\":\"ttCotton\",\"Thickness\":3},{\"Name\":\"Jet Black\",\"Manufacturer\":\"Madeira 40\",\"Code\":\"1000\",\"Red\":0,\"Green\":0,\"Blue\":0,\"Type\":\"ttCotton\",\"Thickness\":3},{\"Name\":\"Sapphire\",\"Manufacturer\":\"Madeira 40\",\"Code\":\"1076\",\"Red\":0,\"Green\":87,\"Blue\":150,\"Type\":\"ttCotton\",\"Thickness\":3},{\"Name\":\"Bordeaux\",\"Manufacturer\":\"Madeira 40\",\"Code\":\"1035\",\"Red\":99,\"Green\":47,\"Blue\":61,\"Type\":\"ttCotton\",\"Thickness\":3},{\"Name\":\"Flesh\",\"Manufacturer\":\"Madeira 40\",\"Code\":\"1017\",\"Red\":244,\"Green\":188,\"Blue\":172,\"Type\":\"ttCotton\",\"Thickness\":3}]},\"Needles\":[1,2,3]}";
            var output = JsonConvert.DeserializeObject<jsonclass>(jsondata);
            int StitchCount = output.NumStitches;
            int StitchHeight = output.Height;
            int StitchWidth = output.Width;
            var pal = output.Palette;


    // The following code is wrong, but illustrates what I'm trying to do

            Response.Write("Colours used: ");

            foreach (thread in pal["Threads"])
            {
               Response.Write(thread["Name"] & ",");
            }

        }

        public class jsonclass
        {
            public int Width { get; set; }
            public int Height { get; set; }
            public int NumStitches { get; set; }
            public Object Palette { get; set; }
        }

我已经对其进行了一些精简,但这是 JSON 数据的可视化表示,以帮助理解它

    {
    "Width":295,
    "Height":329,
    "NumStitches":1596,
    "Palette":
    {

        "Threads":
        [
            {

            "Name":"Black",
            "Manufacturer":"Madeira 40",
            "Code":"1000",
            "Red":0,
            "Green":0,
            "Blue":0,
            "Type":"ttRayon",
            "Thickness":3
            },

            {

            "Name":"Light Blue",
            "Manufacturer":"Madeira 40",
            "Code":"1029",
            "Red":0,
            "Green":114,
            "Blue":207,
            "Type":"ttRayon",
            "Thickness":3
            },

            {

            "Name":"White",
            "Manufacturer":"Madeira 40",
            "Code":"1001",
            "Red":255,
            "Green":255,
            "Blue":255,
            "Type":"ttRayon",
            "Thickness":3
            }
        ]},
    "Needles":[1,2,3]
}

【问题讨论】:

  • 将 Json 映射到类时的一个方便提示是安装 Web Essentials,因为它有一个叫做“将 Json 粘贴为类”的东西。您可以简单地复制 json 字符串,然后粘贴到 Visual Studio,然后它会为您创建匹配的类。
  • 你使用什么版本的网络框架?尝试使用“动态”而不是对象public dynamic Palette { get; set; }您将能够在运行时访问任何属性。
  • @TimBJames,感谢您的建议!
  • @ViktorArsanov 我也找到了那个例子,但是我使用的是 v2 并且它不起作用:(

标签: c# asp.net json json.net


【解决方案1】:

您应该为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;}
  ...
}

然后您可以使用以下代码迭代线程:

foreach (var thread in pal.Threads)
{
  Response.Write(thread.Name + ", ");
}

【讨论】:

  • 这是我尝试过的,但无法弄清楚!不过,我遇到了另一个麻烦,当我添加 foreach 循环时,“线程”一词带有波浪线下划线,并带有警告“找不到类型或名称空间名称“线程”(您是否缺少 using 指令或程序集参考?)”
  • @Chris 抱歉,我无法想象您的问题是什么。我已经完全尝试了我的代码并且它有效。你有和我的例子一样的 foreach 循环吗?您是否还有其他类似的参考资料?如果您将 thread 重命名为例如,会发生什么情况? myTempVariable?
  • 谢谢凯文,你的答案现在有效!有趣的是,BruceWayne 与您的答案相似的另一个回复也有同样的问题,foreach 循环中缺少“var”这个词,导致它停止运行。我尝试使用“字符串”,但它说计算机说不,我没想过使用 var。
  • @Chris,Kevin 犯了我修复的相同的小技术错字(缺少 var),但你应该慢慢学会修复这些错字或代码中的小违规行为,而不是问为什么它不起作用.显然 thread 不能是字符串,因为您正在迭代 Thread 类型的对象集合。因此,简单地说,对于 Threads 集合中的每个 thread 类型的对象 -> 执行此操作。 Var 是一个让编译器决定用什么来替换它的关键字,在这种情况下,它知道那些是 Thread 对象,但你也可以简单地在那里写“pal.Threads 中的线程线程”。
【解决方案2】:

使用以下模型反序列化您的 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; }
}

页面加载

 var output = JsonConvert.DeserializeObject<Colors>(jsondata);

然后迭代线程

  foreach(var thread in output.Palette.Threads){
 //something like you wanted
   Response.Write(thread.Name + ",");
 }

【讨论】:

  • 这看起来很容易理解,但我得到了与上面另一个示例相同的错误。 'thread' 一词带有波浪线下划线,并带有警告“找不到类型或命名空间名称'thread'(您是否缺少 using 指令或程序集引用?)”
  • 漂亮!非常感谢。它说我不能投票,因为刚刚加入!
【解决方案3】:

使用 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多