[英]Parsing/Iterating over Json
我对使用C#解析Json相当陌生,但是我遇到了一个小问题,我无法解决。
我的数据如下所示:
{
"languages": {
"ja_lang": {
"data": {
"name": "Japanese"
},
"files": [["ja",
"Japanese File",
"lang_ja.txt"]]
},
"en_lang": {
"data": {
"name": "English"
},
"files": [["en",
"English File",
"lang_en.txt"]]
}
}
}
现在,我想遍历语言中的项目,并且仅使用对象名称以“ ja_”开头的对象(在这种情况下,它将仅使用“ ja_lang”而不使用“ en_lang”),然后在其中提取名称数据和文件中的“ lang_ja.txt”。
为了解析C#中的Json,我下载了Newtonsoft.Json库,并提出了以下内容:
dynamic json_obj = JsonConvert.DeserializeObject("json string");
// when debugging language holds { "ja_lang": { "data": { "name": "Japanese" }, "files": [["ja", "Japanese File", "lang_ja.txt"]] } }
foreach (var language in json_obj.languages)
{
// not sure how i can access the object-name
/*if(!language.StartsWith("ja_"))
continue;*/
// Exception: 'Newtonsoft.Json.Linq.JProperty' does not contain a definition for 'data' - Not sure why it is treated as a property?
var name = language.data.name;
var file = language.files[2];
}
对于这个可能很愚蠢的问题,我感到很抱歉,但是我一直试图将其转换为其他类型,并在网络上搜索解决方案,但我仍然无法解决。 因此,如果有人可以帮助我,我将非常感激。
提前致谢!
由于您要在注释中(关于已删除的答案)说明数据已更改,因此固定模型无法正常工作,因此您仍然可以解决已知问题:
这是一个LINQPad程序,它演示:
void Main()
{
var collection = JsonConvert.DeserializeObject<LanguagesCollection>(File.ReadAllText(@"c:\temp\test.json"));
foreach (var keyValuePair in collection.Languages)
if (keyValuePair.Key.StartsWith("ja_"))
keyValuePair.Value.Dump();
}
public class LanguagesCollection
{
public Dictionary<string, JObject> Languages { get; } = new Dictionary<string, JObject>();
}
这将使用"languages"
键对外部对象进行反序列化,并且在内部有一个包含键"ja_lang", "en_lang"
的字典,您可以按照自己的"ja_lang", "en_lang"
处理值。 这些保留为JObject
,这意味着它们将包含在字典中作为该键值存在的json。
使用像json2sharp这样的网站,您只需将json数据传入,即可使用c#模型。
然后,您可以轻松地将json数据反序列化到该c#模型中,并使用属性进行更轻松的处理:
string jsonData = @"{
'languages': {
'ja_lang': {
'data': {
'name': 'Japanese'
},
'files': [['ja',
'Japanese File',
'lang_ja.txt']]
},
'en_lang': {
'data': {
'name': 'English'
},
'files': [['en',
'English File',
'lang_en.txt']]
}
}
}";
RootObject data = JsonConvert.DeserializeObject<RootObject>(jsonData);
foreach(Languages lang in data.languages) //would work if Languages was a listing
{
}
尽管我承认您的Json有点奇怪,并且语言最应该列出而不是每种语言的属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.