我很擅长用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"]]
}
}
}
我很抱歉这可能是一个愚蠢的问题,但我一直试图将它转换为不同的类型,并在网上寻找解决方案,但我无法理解。因此,如果有人可以帮我解决这个问题,我会非常感激。
提前致谢!
答案 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有点奇怪,而且最喜欢的语言应该是列表而不是每种语言的属性。