繁体   English   中英

解析/迭代Json

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM