C# C Newtonsoft JSON非常简单,只是不确定我需要的东西的名称
我已经将一个JSON文档读入哈希表,并通过其中的晚餐集开始每个循环 我已经将当前晚餐集存储在我的Helper类中,现在我只需要使用一个名为currentdeen的字符串,该字符串只包含一个mealname,并使用如下内容: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
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)