Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C Newtonsoft JSON非常简单,只是不确定我需要的东西的名称_C#_Json_Json.net - Fatal编程技术网

C# C Newtonsoft JSON非常简单,只是不确定我需要的东西的名称

C# C Newtonsoft JSON非常简单,只是不确定我需要的东西的名称,c#,json,json.net,C#,Json,Json.net,我已经将一个JSON文档读入哈希表,并通过其中的晚餐集开始每个循环 我已经将当前晚餐集存储在我的Helper类中,现在我只需要使用一个名为currentdeen的字符串,该字符串只包含一个mealname,并使用如下内容: String MealID = MyHelper.DinnerSet.Value.Meals.CurrentMeal.MealID 我的问题是,如果我手动执行此操作,我不知道如何将字符串currentMein替换为该字符串,并将整个内容展开以返回mealID: String

我已经将一个JSON文档读入哈希表,并通过其中的晚餐集开始每个循环

我已经将当前晚餐集存储在我的Helper类中,现在我只需要使用一个名为currentdeen的字符串,该字符串只包含一个mealname,并使用如下内容:

String MealID = MyHelper.DinnerSet.Value.Meals.CurrentMeal.MealID
我的问题是,如果我手动执行此操作,我不知道如何将字符串currentMein替换为该字符串,并将整个内容展开以返回mealID:

String MealID = MyHelper.DinnerSet.Value.Meals.Pasta.MealID
我得到了正确的MealID,我确信这是非常简单的,我只是不知道我应该用谷歌搜索什么才能找到正确的轨道

非常感谢您的帮助

编辑:JSON结构示例:

    "DinnerSet001": 
      "Version": "0.1",
      "Enabled" : true,
      "Description": "These are delicious meals for one",
      "Notes": "May contain Gluten or Nuts",
      "Meals": {
        "Pasta": {
            "MealID": "MID001",
            "Description": "Basic Pasta dish in a tomato and basil sauce",
            "Type": "Vegetarian"
        },
我将此JSON读入对象的方式是:

dynamic DinnerSetsHash = JsonConvert.DeserializeObject<Dictionary<String, dynamic>>(jsonContent);
我从其他地方得到了最新的食物,但我知道它包含了我需要的食物,比如意大利面,我希望我能用它来代替它,得到我需要的食物

    String MealID = MyHelper.DinnerSet.Value.Meals.CurrentMeal.MealID
问候
K.

根据您提供的信息,我认为您需要的是方括号语法,也称为索引器语法。例如:

string CurrentMeal = "Pasta";
  ...
string MealID = DinnerSet.Value.Meals[CurrentMeal].MealID;
小提琴:

我同意@dbc的评论,您最好使用强类型模型,而不是动态模型,这样您就可以获得Intellisense和编译时类型检查的好处

以下模型应基于您给出的JSON工作:

public class DinnerSet
{
    public string Version { get; set; }
    public bool Enabled { get; set; }
    public string Description { get; set; }
    public string Notes { get; set; }
    public Dictionary<string, Meal> Meals { get; set; }
}

public class Meal
{
    public string MealID { get; set; }
    public string Description { get; set; }
    public string Type { get; set; }
}
然后,您可以将其反序列化到字典中,而不是字典中,并且您的代码仍然应该只进行最小的更改


小提琴手:

谢谢你的意见

我昨晚仔细考虑了这个问题,我想我一直需要问的问题是如何处理一个JSON文件,它和我的一样是动态的,它可以有任意数量的晚餐集,它们可以包含任意数量的晚餐

我最初在VisualStudio中使用“粘贴特殊->粘贴JSON”作为类使用强类型路径,但由于我现在忘记的原因,这对我来说不起作用

我会用索引器语法做一些测试谢谢你的名字!这让我抓狂:

我还想到了另一种方式来表示我正在尝试做的事情,我知道,例如在PowerShell中,我可以这样做:

     MealID = (DinnerSet.Value.Meals$(CurrentMeal)`.MealID)
这会扩展整个右手边,给我我想要的价值。如果C中有一个等价物,它也可以为我解决这个问题

编辑:是的,索引器语法与PowerShell中的$一样工作,谢谢:


除此之外,我将使用indexer语法进行测试,并将您的回答标记为现在的答案,这给了我很多可以玩的东西,谢谢大家

你能展示一下你的JSON结构/布局吗?当然可以,给我5分钟的时间。谢谢好的,这个JSON示例很有帮助。在JSON本身的任何地方,而不是代码中,您是否有CurrentMein字段?你的样品没有显示出那样的东西。另外,您是否有专门用于导入JSON数据的类?这也可能有所帮助。本质上-我根本不明白为什么要使用currentdeen。好的,让我看看是否可以围绕此添加更多代码以提供更多上下文。。。。谢谢大家1为什么要使用动态而不是反序列化到显式数据模型?2如果您不能使用显式数据模型,为什么不使用JToken,因为它的可用方法和属性是显式的,并且可以通过IntelliSense发现?您可能放弃了强类型模型,因为生成器不知道键何时是动态的,在这种情况下,硬编码类名也不知道。因此,您要做的是从生成的类开始,然后在键是动态的地方使用字典,其中T是项数据的类型。我上面建议的模型使用这种方法来处理用餐的动态键。类似地,在根目录处反序列化到字典中处理晚餐集的动态键。JSON的其余部分不是动态的,所以常规类可以很好地工作。下面是一个简单的例子:谢谢Brian,我想我会考虑让这个类成为一个强类型类,并按照您的建议处理动态位,从长远来看,这样做会简单得多:
     MealID = (DinnerSet.Value.Meals$(CurrentMeal)`.MealID)