internal static CacheSerializationContract FromJsonString(string json) { JObject root = JObject.Parse(json); var unkownNodes = ExtractUnkownNodes(root); var contract = new CacheSerializationContract(unkownNodes); // Access Tokens if (root.ContainsKey(StorageJsonValues.CredentialTypeAccessToken)) { foreach (var token in root[StorageJsonValues.CredentialTypeAccessToken] .Values()) { if (token is JObject j) { var item = MsalAccessTokenCacheItem.FromJObject(j); contract.AccessTokens[item.GetKey().ToString()] = item; } } } // Refresh Tokens if (root.ContainsKey(StorageJsonValues.CredentialTypeRefreshToken)) { foreach (var token in root[StorageJsonValues.CredentialTypeRefreshToken] .Values()) { if (token is JObject j) { var item = MsalRefreshTokenCacheItem.FromJObject(j); contract.RefreshTokens[item.GetKey().ToString()] = item; } } } // Id Tokens if (root.ContainsKey(StorageJsonValues.CredentialTypeIdToken)) { foreach (var token in root[StorageJsonValues.CredentialTypeIdToken] .Values()) { if (token is JObject j) { var item = MsalIdTokenCacheItem.FromJObject(j); contract.IdTokens[item.GetKey().ToString()] = item; } } } // Accounts if (root.ContainsKey(StorageJsonValues.AccountRootKey)) { foreach (var token in root[StorageJsonValues.AccountRootKey] .Values()) { if (token is JObject j) { var item = MsalAccountCacheItem.FromJObject(j); contract.Accounts[item.GetKey().ToString()] = item; } } } // App Metadata if (root.ContainsKey(StorageJsonValues.AppMetadata)) { foreach (var token in root[StorageJsonValues.AppMetadata] .Values()) { if (token is JObject j) { var item = MsalAppMetadataCacheItem.FromJObject(j); contract.AppMetadata[item.GetKey().ToString()] = item; } } } return(contract); }