C# 解码具有未知密钥的Json对象

C# 解码具有未知密钥的Json对象,c#,json,unity3d,C#,Json,Unity3d,我有一个json对象,我不知道对象中的键是什么,有没有办法用Unity的JsonUtility来解码这样的对象 以下是我所拥有的,但它不起作用: [RequireComponent(typeof(Text))] public class GameSmartTranslate : MonoBehaviour { public string translationKey; Text text; // Use this for initialization voi

我有一个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文件,而且由于每个游戏都有不同的游戏性,这意味着每个游戏中的文本也不同,并且密钥的数量也会不同。这也是我必须管理的sdk,它将被放入许多游戏中。

根据您的评论,您真正需要的是两个级别的序列化,一个级别表示每个翻译的单词,另一个级别包含单词数组

[Serializable]
public class Word{
    public string key;
    public string value;
}

[Serializable]
public class Translation 
{ 
     public Word[] wordList; 
}
这将被翻译成类似于

{
   "wordList": [
      {
         "key": "Hello!",
         "value": "¡Hola!"
      },
      {
         "key": "Goodbye",
         "value": "Adiós"
      }
   ]
}
一旦反序列化了
翻译
对象,您就可以将其转换为字典,以便更快地查找

Translation items = JsonUtility.FromJson<Translation>(transFile.text);
Dictionary<string, string> transDict = items.wordList.ToDictionary(x=>x.key, y=>y.value);
这将使您摆脱
Translation
类,您的代码如下所示

Word[] items = JsonUtility.FromJson<Word[]>(transFile.text);
Word[]items=JsonUtility.FromJson(transFile.text);

但是我非常确定Unity 5.3不能直接在数组类型上工作,我没有尝试过使用5.4。

你真的不知道模式是什么,或者你知道“如果属性
X
的值为
Foo
,那么我知道json描述了一个
Foo
对象,并且可以作为一个对象进行反分析”,或者你有一个项目数组,但你不知道数组中有多少项目。很少有人会不知道输入是什么。@ScottChamberlain我不知道这些键的原因是因为我为许多游戏管理一个sdk,每个游戏都需要翻译,因此每个项目都有一个键(翻译的标识符,如
分数
)和一个值(翻译文本,如
Score
得分了
ГöП
)。因为每个游戏都不同,所以所有的键也会不同。这是我正在做的事情,所以没有对象数组就无法做到这一点?你需要某种可预测的结构。你可以试着只做一个裸数组(参见我的更新)但是我不知道unity是否支持直接取消对数组的搜索。这就是为什么我创建了wrapper
Translation
类,它充当根对象。但是Json top对象是一个数组,此时unity serializer不支持。所以wordlist仍然需要包装在另一个级别中。
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;
    }
}
[{
    "key": "Hello!",
    "value": "¡Hola!"
}, {
    "key": "Goodbye",
    "value": "Adiós"
}]
Word[] items = JsonUtility.FromJson<Word[]>(transFile.text);