解析/迭代Json

时间:2018-05-25 07:57:29

标签: c# json json.net

我很擅长用C#解析Json而且我遇到了一个问题,我无法解决这个问题。

我的数据看起来像这样:

SCNBillboardConstraint

现在我想迭代语言中的项目,只能使用对象名称以“ja_”开头的那个项目(在这种情况下它只适用于“ja_lang”并忽略“en_lang”),然后提取数据内部的名称和文件中的“lang_ja.txt”。

在C#中解析Json我下载了Newtonsoft.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"]]
        }
    }
}

我很抱歉这可能是一个愚蠢的问题,但我一直试图将它转换为不同的类型,并在网上寻找解决方案,但我无法理解。因此,如果有人可以帮我解决这个问题,我会非常感激。

提前致谢!

2 个答案:

答案 0 :(得分:3)

由于您在评论(已删除的答案)中说明数据发生了变化,因此固定模型无法正常工作,您仍然可以解决已知问题:

这是一个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"的字典,您可以根据需要处理这些值。它们保留为JObject,这意味着它们将包含json作为字典中该键的值而存在的任何内容。

答案 1 :(得分:0)

使用像json2sharp这样的网站,你可以直接传递你的json数据并准备好使用c#model。

然后,您可以轻松地将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有点奇怪,而且最喜欢的语言应该是列表而不是每种语言的属性。