我有一个json对象,我不知道对象中的键是什么,有没有办法用Unity的JsonUtility解码这样的对象?
这是我所拥有的,但它不起作用:
[RequireComponent(typeof(Text))]
public class GameSmartTranslate : MonoBehaviour {
public string translationKey;
Text text;
// Use this for initialization
void Start () {
text = GetComponent<Text>();
GetTranslationFile();
}
void GetTranslationFile(){
string lang = GameSmart.Web.Locale(true);
TextAsset transFile = Resources.Load<TextAsset>("Text/" + lang);
Trans items = JsonUtility.FromJson<Trans>(transFile.text);
}
}
[System.SerializableAttribute]
class Trans {
public string key;
public string value;
}
测试json文件看起来像这样(文件键很可能不是one
和two
):
{
"one": "First Item",
"two": "Second Item"
}
键是“未知”的原因是因为这是一个用于翻译的json文件,并且由于每个游戏都有不同的游戏玩法,这意味着每个游戏中的文本也不同,并且键的数量也会不同。这也是我必须管理的sdk,它将被用于许多游戏。
答案 0 :(得分:2)
根据您的评论,您真正需要的是两个级别的序列化,一个级别代表每个翻译的单词,另一个级别代表单词数组。
[Serializable]
public class Word{
public string key;
public string value;
}
[Serializable]
public class Translation
{
public Word[] wordList;
}
这将转换为类似于
的JSON{
"wordList": [
{
"key": "Hello!",
"value": "¡Hola!"
},
{
"key": "Goodbye",
"value": "Adiós"
}
]
}
反序列化Translation
对象后,您可以将其转换为字典以便更快地进行查找。
Translation items = JsonUtility.FromJson<Translation>(transFile.text);
Dictionary<string, string> transDict = items.wordList.ToDictionary(x=>x.key, y=>y.value);
通过将关键字作为未翻译的单词,很容易制作一个扩展方法,该方法将在字典中查找已翻译的单词,但如果找不到,则会使用该键。
public static class ExtensionMethods
{
public static string GetTranslationOrDefault(this Dictionary<string, string> dict, string word)
{
string result;
if(!dict.TryGetValue(word, out result)
{
//Word was not in the dictionary, return the key.
result = word;
}
return result;
}
}
您可以使用
[RequireComponent(typeof(Text))]
public class GameSmartTranslate : MonoBehaviour {
public string translationKey;
Text text;
void Start() {
text = GetComponent<Text>();
Dictionary<string, string> transDict = GetTranslationFile();
//If the translation is not defined the text is set to translationKey
text.text = transDict.GetTranslationOrDefault(translationKey);
}
Dictionary<string, string> GetTranslationFile(){
string lang = GameSmart.Web.Locale(true);
TextAsset transFile = Resources.Load<TextAsset>("Text/" + lang);
Translation items = JsonUtility.FromJson<Translation>(transFile.text);
Dictionary<string, string> transDict = items.wordList.ToDictionary(x=>x.key, y=>y.value);
return transDict;
}
}
您可能想尝试将字典代码移出GameSmartTranslate
并将其放在单个游戏对象中,这样就不会为每个包含此脚本的标签重新构建字典。
<强>更新强>
您也可以尝试使用json
[{
"key": "Hello!",
"value": "¡Hola!"
}, {
"key": "Goodbye",
"value": "Adiós"
}]
这可以让你摆脱Translation
类,你的代码看起来像
Word[] items = JsonUtility.FromJson<Word[]>(transFile.text);
但我很确定Unity 5.3不能直接使用数组类型,我没有试过5.4。