【问题标题】:JSON.NET C# getting access to deserialised objectJSON.NET C# 访问反序列化对象
【发布时间】:2014-03-28 11:50:01
【问题描述】:

我有一些 JSON 数据,我已设法获取并放入动态类型中。

这是 JSON 的样子。

{"fruits":{"a":"orange","b":"banana","c":"apple"},"numbers":[1,2,3,4,5,6],"holes":{"0":"first","5":"second","6":"third"}}

这是我使用动态类型收集它的方式。

dynamic myObj =JsonConvert.DeserializeObject(output);

我需要找到一种方法来分离对象并放置在某种数组中,以便我可以掌握这些值。假设我想获取孔数组并访问某种循环中的所有值。

任何建议将不胜感激。

谢谢

【问题讨论】:

  • 创建一个表示 JSON 对象结构的类,并将您的 JSON 数据反序列化到该类中。有关示例,请参见 citronas 答案。

标签: c# .net json linq


【解决方案1】:

看看System.Web.Script.Serialization.JavaScriptSerializer

您可以将 JSON 字符串反序列化为强类型类,如下所示:

数据类

public class AutocompleteAction
{
    public String action { get; set; }
}

你会有嵌套类。然后语法看起来类似于parse google maps geocode json response to object using Json.Net

用法

string json = // your json string
JavaScriptSerializer js = new JavaScriptSerializer();
AutocompleteAction jsonObject = js.Deserialize<AutocompleteAction>(json);
switch (jsonObject.action)
{
  //
}

【讨论】:

  • 我同意 100%,但这更像是对 OP 的说明。您的 json 对象只有 1 个数组,其他只是对象属性。这看起来是动态的,并且会使得创建一个类变得非常困难。如果它是一个对象数组,你可以做一个键值对的集合。
  • 我理解了 OP 的以下语句“假设我想获取孔数组并访问某种循环中的所有值。”因为他会知道在设计时存在哪些键。在这种情况下,我认为创建类将是一个有效的选择。
  • ` 字符串输出 = writeClient.Get("mykey"); AutocompleteAction jsonObject = js.Deserialize(output);` 目前,当我在控制台应用程序中将其中断时,它为空。对吗?
  • @citronas,我同意上课是正确的方式。但他想得到孔阵列。没有孔阵列。孔是具有 3 个对象属性的对象。不是数组,也不能序列化成数组。您的解决方案对于他描述的情况是正确的,但我只是让 OP 知道它不适用于实际情况。我不是告诉你你错了。我只是添加信息作为你的答案(虽然有帮助)并不能真正解决他的问题。
  • 我不是想冒犯你,我只是想帮助 OP 更好地理解他的问题。
【解决方案2】:

我最终使用 Json.NET 做到了这一点。希望它对某人有用。会喜欢 cmets 和批评,因为可能有更好的方法。

string output = writeClient.Get<string>("mykey");
            JObject myObj = (JObject)JsonConvert.DeserializeObject(output);
            JObject fruits = myObj["fruits"] as JObject;
            JObject holes = myObj["holes"] as JObject;

            foreach (var fruit in fruits)
            {

                MyTestClass myClass = new MyTestClass();
                myClass.myKey = fruit.Key;
                myClass.myVal = fruit.Value.ToString();

            }

            JToken nums = myObj["nums"];
            IEnumerable<string> allString = nums.Children().Values<string>();

            foreach (var myVal in allString)
            {
                // do something..
            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多