internal override void MergeItem(object content, JsonMergeSettings settings) { JConstructor c = content as JConstructor; if (c == null) return; if (c.Name != null) Name = c.Name; MergeEnumerableContent(this, c, settings); }
internal override void MergeItem(object content, JsonMergeSettings settings) { JObject o = content as JObject; if (o == null) { return; } foreach (KeyValuePair <string, JToken> contentItem in o) { JProperty existingProperty = Property(contentItem.Key); if (existingProperty == null) { Add(contentItem.Key, contentItem.Value); } else if (contentItem.Value != null) { JContainer existingContainer = existingProperty.Value as JContainer; if (existingContainer == null) { if (contentItem.Value.Type != JTokenType.Null) { existingProperty.Value = contentItem.Value; } } else if (existingContainer.Type != contentItem.Value.Type) { existingProperty.Value = contentItem.Value; } else { existingContainer.Merge(contentItem.Value, settings); } } } }
internal static void MergeEnumerableContent(JContainer target, IEnumerable content, JsonMergeSettings settings) { switch (settings.MergeArrayHandling) { case MergeArrayHandling.Concat: foreach (JToken item in content) { target.Add(item); } break; case MergeArrayHandling.Union: #if !NET20 HashSet <JToken> items = new HashSet <JToken>(target, EqualityComparer); foreach (JToken item in content) { if (items.Add(item)) { target.Add(item); } } #else IDictionary <JToken, bool> items = new Dictionary <JToken, bool>(EqualityComparer); foreach (JToken t in target) { items[t] = true; } foreach (JToken item in content) { if (!items.ContainsKey(item)) { items[item] = true; target.Add(item); } } #endif break; case MergeArrayHandling.Replace: target.ClearItems(); foreach (JToken item in content) { target.Add(item); } break; case MergeArrayHandling.Merge: int i = 0; foreach (object targetItem in content) { if (i < target.Count) { JToken sourceItem = target[i]; JContainer existingContainer = sourceItem as JContainer; if (existingContainer != null) { existingContainer.Merge(targetItem, settings); } else { if (targetItem != null) { JToken contentValue = CreateFromContent(targetItem); if (contentValue.Type != JTokenType.Null) { target[i] = contentValue; } } } } else { target.Add(targetItem); } i++; } break; default: throw new ArgumentOutOfRangeException(nameof(settings), "Unexpected merge array handling when merging JSON."); } }
// Load RS1 CDLC into PackageCreator public static DLCPackageData RS1LoadFromFolder(string unpackedDir, Platform targetPlatform, bool convert) { var data = new DLCPackageData(); data.Arrangements = new List<Arrangement>(); data.TonesRS2014 = new List<Tone2014>(); data.Tones = new List<Tone>(); data.GameVersion = (convert ? GameVersion.RS2014 : GameVersion.RS2012); data.SignatureType = PackageMagic.CON; // set default volumes data.Volume = -6.5F; // default maybe too quite data.PreviewVolume = data.Volume; //Load song manifest var songsManifestJson = Directory.GetFiles(unpackedDir, "songs.manifest.json", SearchOption.AllDirectories); if (songsManifestJson.Length < 1) throw new DataException("No songs.manifest.json file found."); if (songsManifestJson.Length > 1) throw new DataException("More than one songs.manifest.json file found."); var attr = new List<Attributes>(); var songsManifest = Manifest.Manifest.LoadFromFile(songsManifestJson[0]).Entries.ToArray(); for (int smIndex = 0; smIndex < songsManifest.Count(); smIndex++) { var smData = songsManifest[smIndex].Value.ToArray()[0].Value; attr.Add(smData); } if (attr.FirstOrDefault() == null) throw new DataException("songs.manifest.json file did not parse correctly."); // Fill SongInfo data.SongInfo = new SongInfo(); data.SongInfo.SongDisplayName = attr.FirstOrDefault().SongName; data.SongInfo.SongDisplayNameSort = attr.FirstOrDefault().SongNameSort; data.SongInfo.Album = attr.FirstOrDefault().AlbumName; data.SongInfo.SongYear = (attr.FirstOrDefault().SongYear == 0 ? 2012 : attr.FirstOrDefault().SongYear); data.SongInfo.Artist = attr.FirstOrDefault().ArtistName; data.SongInfo.ArtistSort = attr.FirstOrDefault().ArtistNameSort; data.Name = attr.FirstOrDefault().SongKey; //Load tone manifest, even poorly formed tone_bass.manifest.json var toneManifestJson = Directory.GetFiles(unpackedDir, "*tone*.manifest.json", SearchOption.AllDirectories); if (toneManifestJson.Length < 1) throw new DataException("No tone.manifest.json file found."); // toolkit produces multiple tone.manifest.json files when packing RS1 CDLC files // rather than change toolkit behavior just merge manifest files for now if (toneManifestJson.Length > 1) { var mergeSettings = new JsonMergeSettings { MergeArrayHandling = MergeArrayHandling.Union }; JObject toneObject1 = new JObject(); foreach (var tone in toneManifestJson) { JObject toneObject2 = JObject.Parse(File.ReadAllText(tone)); //(toneObject1.SelectToken("Entries") as JArray).Merge(toneObject2.SelectToken("Entries")); toneObject1.Merge(toneObject2, mergeSettings); } toneManifestJson = new string[1]; toneManifestJson[0] = Path.Combine(unpackedDir, "merged.tone.manifest.json"); string json = JsonConvert.SerializeObject(toneObject1, Formatting.Indented); File.WriteAllText(toneManifestJson[0], json); } var tones2014 = new List<Tone2014>(); var tones = new List<Tone>(); var toneManifest = Manifest.Tone.Manifest.LoadFromFile(toneManifestJson[0]); for (int tmIndex = 0; tmIndex < toneManifest.Entries.Count(); tmIndex++) { var tmData = toneManifest.Entries[tmIndex]; tones.Add(tmData); } data.Tones = tones; // Load AggregateGraph.nt var songDir = Path.Combine(unpackedDir, data.Name); if (targetPlatform.platform == GamePlatform.XBox360) songDir = Path.Combine(unpackedDir, "Root", data.Name); var aggFile = Directory.GetFiles(songDir, "*.nt", SearchOption.TopDirectoryOnly)[0]; var aggGraphData = AggregateGraph.AggregateGraph.ReadFromFile(aggFile); // Load Exports\Songs\*.xblock var xblockDir = Path.Combine(songDir, "Exports\\Songs"); var xblockFile = Directory.GetFiles(xblockDir, "*.xblock", SearchOption.TopDirectoryOnly)[0]; // xblockFile = "D:\\Temp\\Mapping\\songs.xblock"; var songsXblock = XblockX.LoadFromFile(xblockFile); // create project map for cross referencing arrangements with tones var projectMap = AggregateGraph.AggregateGraph.ProjectMap(aggGraphData, songsXblock, toneManifest); // Load xml arrangements var xmlFiles = Directory.GetFiles(unpackedDir, "*.xml", SearchOption.AllDirectories); if (xmlFiles.Length <= 0) throw new DataException("Can not find any XML arrangement files"); foreach (var xmlFile in xmlFiles) { if (xmlFile.ToLower().Contains("metadata")) // skip DeadFox file continue; // some poorly formed RS1 CDLC use just "vocal" if (xmlFile.ToLower().Contains("vocal")) { // Add Vocal Arrangement data.Arrangements.Add(new Arrangement { Name = ArrangementName.Vocals, ArrangementType = ArrangementType.Vocal, ScrollSpeed = 20, SongXml = new SongXML { File = xmlFile }, SongFile = new SongFile { File = "" }, CustomFont = false }); } else { var attr2014 = new Attributes2014(); var rsSong = new Song(); var rsSong2014 = new Song2014(); // optimized tone matching effort using project mapping algo var result = projectMap.First(m => String.Equals(Path.GetFileName(m.SongXmlPath), Path.GetFileName(xmlFile), StringComparison.CurrentCultureIgnoreCase)); if (result.Tones.Count != 1) throw new DataException("Invalid RS1 CDLC Tones Data"); var arrangement = attr.First(s => s.SongXml.ToLower().Contains(result.LLID)); var tone = tones.First(t => t.Key == result.Tones[0]); using (var obj1 = new Rs1Converter()) { rsSong = obj1.XmlToSong(xmlFile); data.SongInfo.AverageTempo = (int)obj1.AverageBPM(rsSong); } if (arrangement.Tuning == "E Standard") rsSong.Tuning = new TuningStrings { String0 = 0, String1 = 0, String2 = 0, String3 = 0, String4 = 0, String5 = 0 }; else if (arrangement.Tuning == "DropD") rsSong.Tuning = new TuningStrings { String0 = -2, String1 = 0, String2 = 0, String3 = 0, String4 = 0, String5 = 0 }; else if (arrangement.Tuning == "OpenG") rsSong.Tuning = new TuningStrings { String0 = -2, String1 = -2, String2 = 0, String3 = 0, String4 = 0, String5 = -2 }; else if (arrangement.Tuning == "EFlat") rsSong.Tuning = new TuningStrings { String0 = -1, String1 = -1, String2 = -1, String3 = -1, String4 = -1, String5 = -1 }; else // default to standard tuning { arrangement.Tuning = "E Standard"; rsSong.Tuning = new TuningStrings { String0 = 0, String1 = 0, String2 = 0, String3 = 0, String4 = 0, String5 = 0 }; } // save/write the changes to xml file using (var obj1 = new Rs1Converter()) obj1.SongToXml(rsSong, xmlFile, true); if (convert) using (var obj1 = new Rs1Converter()) tones2014.Add(obj1.ToneToTone2014(tone, rsSong)); // load attr2014 with RS1 mapped values for use by Arrangement() attr2014.Tone_Base = tone.Name; attr2014.ArrangementName = arrangement.ArrangementName; attr2014.CentOffset = 0; attr2014.DynamicVisualDensity = new List<float>() { 2 }; attr2014.SongPartition = arrangement.SongPartition; attr2014.PersistentID = IdGenerator.Guid().ToString(); attr2014.MasterID_RDV = RandomGenerator.NextInt(); attr2014.ArrangementProperties = new SongArrangementProperties2014(); // processing order is important - CAREFUL // RouteMask None = 0, Lead = 1, Rhythm = 2, Any = 3, Bass = 4 // XML file names are usually meaningless to arrangement determination if (arrangement.ArrangementName.ToLower().Contains("lead") || rsSong.Arrangement.ToLower().Contains("lead")) { attr2014.ArrangementName = "Lead"; attr2014.ArrangementType = (int)ArrangementType.Guitar; attr2014.ArrangementProperties.RouteMask = (int)RouteMask.Lead; attr2014.ArrangementProperties.PathLead = 1; attr2014.ArrangementProperties.PathRhythm = 0; attr2014.ArrangementProperties.PathBass = 0; } else if (arrangement.ArrangementName.ToLower().Contains("rhythm") || rsSong.Arrangement.ToLower().Contains("rhythm")) // || rsSong.Arrangement.ToLower().Contains("guitar")) { attr2014.ArrangementName = "Rhythm"; attr2014.ArrangementType = (int)ArrangementType.Guitar; attr2014.ArrangementProperties.RouteMask = (int)RouteMask.Rhythm; attr2014.ArrangementProperties.PathLead = 0; attr2014.ArrangementProperties.PathRhythm = 1; attr2014.ArrangementProperties.PathBass = 0; } else if (arrangement.ArrangementName.ToLower().Contains("combo") || rsSong.Arrangement.ToLower().Contains("combo")) { attr2014.ArrangementName = "Combo"; attr2014.ArrangementType = (int)ArrangementType.Guitar; attr2014.ArrangementProperties.RouteMask = arrangement.EffectChainName.ToLower().Contains("lead") ? (int)RouteMask.Lead : (int)RouteMask.Rhythm; attr2014.ArrangementProperties.PathLead = arrangement.EffectChainName.ToLower().Contains("lead") ? 1 : 0; attr2014.ArrangementProperties.PathRhythm = arrangement.EffectChainName.ToLower().Contains("lead") ? 0 : 1; attr2014.ArrangementProperties.PathBass = 0; } else if (arrangement.ArrangementName.ToLower().Contains("bass") || rsSong.Arrangement.ToLower().Contains("bass")) { attr2014.ArrangementName = "Bass"; attr2014.ArrangementType = (int)ArrangementType.Bass; attr2014.ArrangementProperties.RouteMask = (int)RouteMask.Bass; attr2014.ArrangementProperties.PathLead = 0; attr2014.ArrangementProperties.PathRhythm = 0; attr2014.ArrangementProperties.PathBass = 1; } else { // default to Lead arrangment attr2014.ArrangementName = "Lead"; attr2014.ArrangementType = (int)ArrangementType.Guitar; attr2014.ArrangementProperties.RouteMask = (int)RouteMask.Lead; attr2014.ArrangementProperties.PathLead = 1; attr2014.ArrangementProperties.PathRhythm = 0; attr2014.ArrangementProperties.PathBass = 0; Console.WriteLine("RS1->RS2 CDLC Conversion defaulted to 'Lead' arrangment"); } if (convert) // RS1 -> RS2 magic { using (var obj1 = new Rs1Converter()) rsSong2014 = obj1.SongToSong2014(rsSong); // update ArrangementProperties rsSong2014.ArrangementProperties.RouteMask = attr2014.ArrangementProperties.RouteMask; rsSong2014.ArrangementProperties.PathLead = attr2014.ArrangementProperties.PathLead; rsSong2014.ArrangementProperties.PathRhythm = attr2014.ArrangementProperties.PathRhythm; rsSong2014.ArrangementProperties.PathBass = attr2014.ArrangementProperties.PathBass; rsSong2014.ArrangementProperties.StandardTuning = (arrangement.Tuning == "E Standard" ? 1 : 0); // <note time="58.366" linkNext="0" accent="0" bend="0" fret="7" hammerOn="0" harmonic="0" hopo="0" ignore="0" leftHand="-1" mute="0" palmMute="0" pluck="-1" pullOff="0" slap="-1" slideTo="-1" string="3" sustain="0.108" tremolo="0" harmonicPinch="0" pickDirection="0" rightHand="-1" slideUnpitchTo="-1" tap="0" vibrato="0" /> if (rsSong2014.Levels.Any(sl => sl.Notes.Any(sln => sln.Bend != 0))) rsSong2014.ArrangementProperties.Bends = 1; if (rsSong2014.Levels.Any(sl => sl.Notes.Any(sln => sln.Hopo != 0))) rsSong2014.ArrangementProperties.Hopo = 1; if (rsSong2014.Levels.Any(sl => sl.Notes.Any(sln => sln.SlideTo != -1))) rsSong2014.ArrangementProperties.Slides = 1; if (rsSong2014.Levels.Any(sl => sl.Notes.Any(sln => sln.Sustain > 0))) rsSong2014.ArrangementProperties.Sustain = 1; // fixing times that are off var lastEbeatsTime = rsSong2014.Ebeats[rsSong2014.Ebeats.Length - 1].Time; var lastPhraseIterationsTime = rsSong2014.PhraseIterations[rsSong2014.PhraseIterations.Length - 1].Time; // tested ... not source of in game hangs // confirm last PhraseIterations time is less than last Ebeats time if (lastPhraseIterationsTime > lastEbeatsTime) { rsSong2014.PhraseIterations[rsSong2014.PhraseIterations.Length - 1].Time = lastEbeatsTime; rsSong2014.Sections[rsSong2014.Sections.Length - 1].StartTime = lastEbeatsTime; } // tested ... not source of in game hangs // confirm SongLength at least equals last Ebeats time if (rsSong2014.SongLength < lastEbeatsTime) rsSong2014.SongLength = lastEbeatsTime; using (var obj2 = new Rs2014Converter()) obj2.Song2014ToXml(rsSong2014, xmlFile, true); } // Adding Song Arrangement try { data.Arrangements.Add(new Arrangement(attr2014, xmlFile)); } catch (Exception ex) { // mainly for the benifit of convert2012 CLI users Console.WriteLine(@"This CDLC could not be auto converted." + Environment.NewLine + "You can still try manually adding the arrangements and assests." + Environment.NewLine + ex.Message); } } } if (convert) { // get rid of duplicate tone names tones2014 = tones2014.Where(p => p.Name != null) .GroupBy(p => p.Name).Select(g => g.First()).ToList(); data.TonesRS2014 = tones2014; } //Get Album Artwork DDS Files var artFiles = Directory.GetFiles(unpackedDir, "*.dds", SearchOption.AllDirectories); if (artFiles.Length < 1) throw new DataException("No Album Artwork file found."); if (artFiles.Length > 1) throw new DataException("More than one Album Artwork file found."); var targetArtFiles = new List<DDSConvertedFile>(); data.AlbumArtPath = artFiles[0]; targetArtFiles.Add(new DDSConvertedFile() { sizeX = 256, sizeY = 256, sourceFile = artFiles[0], destinationFile = artFiles[0].CopyToTempFile(".dds") }); data.ArtFiles = targetArtFiles; //Audio files var targetAudioFiles = new List<string>(); var audioFiles = Directory.GetFiles(unpackedDir, "*.ogg", SearchOption.AllDirectories); if (audioFiles.Length < 1) throw new DataException("No Audio file found."); if (audioFiles.Length > 2) throw new DataException("Too many Audio files found."); int i; for (i = 0; i < audioFiles.Length; i++) { if (convert && audioFiles[i].Contains("_fixed.ogg")) // use it break; if (!convert && !audioFiles[i].Contains("_fixed.ogg")) break; } // FIXME: platform specific decode is broken var sourcePlatform = unpackedDir.GetPlatform(); if (targetPlatform.IsConsole != (sourcePlatform = audioFiles[i].GetAudioPlatform()).IsConsole) { var newFile = Path.Combine(Path.GetDirectoryName(audioFiles[i]), String.Format("{0}_cap.ogg", Path.GetFileNameWithoutExtension(audioFiles[i]))); OggFile.ConvertAudioPlatform(audioFiles[i], newFile); audioFiles[i] = newFile; } targetAudioFiles.Add(audioFiles[i]); if (!targetAudioFiles.Any()) throw new DataException("Audio file not found."); var a = new FileInfo(audioFiles[i]); data.OggPath = a.FullName; //AppID if (!sourcePlatform.IsConsole) { if (!convert) { var appidFile = Directory.GetFiles(unpackedDir, "*APP_ID*", SearchOption.AllDirectories); if (appidFile.Length > 0) data.AppId = File.ReadAllText(appidFile[0]); } else data.AppId = "248750"; } try {//TODO: validate that rs1 songs have no this file //Package version var versionFile = Directory.GetFiles(unpackedDir, "toolkit.version", SearchOption.AllDirectories); if (versionFile.Length > 0) data.PackageVersion = GeneralExtensions.ReadPackageVersion(versionFile[0]); else data.PackageVersion = "1"; } catch {} if (convert) data.Tones = null; return data; }
// Token: 0x06001267 RID: 4711 RVA: 0x00064824 File Offset: 0x00062A24 public void Merge(object content, [Nullable(2)] JsonMergeSettings settings) { this.MergeItem(content, settings); }
// Token: 0x06001265 RID: 4709 internal abstract void MergeItem(object content, [Nullable(2)] JsonMergeSettings settings);
// Token: 0x06001298 RID: 4760 RVA: 0x00064E40 File Offset: 0x00063040 internal static void MergeEnumerableContent(JContainer target, IEnumerable content, [Nullable(2)] JsonMergeSettings settings) { switch ((settings != null) ? settings.MergeArrayHandling : MergeArrayHandling.Concat) { case MergeArrayHandling.Concat: using (IEnumerator enumerator = content.GetEnumerator()) { while (enumerator.MoveNext()) { object obj = enumerator.Current; JToken content2 = (JToken)obj; target.Add(content2); } return; } break; case MergeArrayHandling.Union: break; case MergeArrayHandling.Replace: goto IL_CB; case MergeArrayHandling.Merge: goto IL_11A; default: goto IL_1CC; } HashSet <JToken> hashSet = new HashSet <JToken>(target, JToken.EqualityComparer); using (IEnumerator enumerator = content.GetEnumerator()) { while (enumerator.MoveNext()) { object obj2 = enumerator.Current; JToken jtoken = (JToken)obj2; if (hashSet.Add(jtoken)) { target.Add(jtoken); } } return; } IL_CB: if (target == content) { return; } target.ClearItems(); using (IEnumerator enumerator = content.GetEnumerator()) { while (enumerator.MoveNext()) { object obj3 = enumerator.Current; JToken content3 = (JToken)obj3; target.Add(content3); } return; } IL_11A: int num = 0; using (IEnumerator enumerator = content.GetEnumerator()) { while (enumerator.MoveNext()) { object obj4 = enumerator.Current; if (num < target.Count) { JContainer jcontainer = target[num] as JContainer; if (jcontainer != null) { jcontainer.Merge(obj4, settings); } else if (obj4 != null) { JToken jtoken2 = JContainer.CreateFromContent(obj4); if (jtoken2.Type != JTokenType.Null) { target[num] = jtoken2; } } } else { target.Add(obj4); } num++; } return; } IL_1CC: throw new ArgumentOutOfRangeException("settings", "Unexpected merge array handling when merging JSON."); }
internal static void MergeEnumerableContent( JContainer target, IEnumerable content, JsonMergeSettings settings) { switch (settings.MergeArrayHandling) { case MergeArrayHandling.Concat: IEnumerator enumerator1 = content.GetEnumerator(); try { while (enumerator1.MoveNext()) { JToken current = (JToken)enumerator1.Current; target.Add((object)current); } break; } finally { if (enumerator1 is IDisposable disposable) { disposable.Dispose(); } } case MergeArrayHandling.Union: HashSet <JToken> jtokenSet = new HashSet <JToken>((IEnumerable <JToken>)target, (IEqualityComparer <JToken>)JToken.EqualityComparer); IEnumerator enumerator2 = content.GetEnumerator(); try { while (enumerator2.MoveNext()) { JToken current = (JToken)enumerator2.Current; if (jtokenSet.Add(current)) { target.Add((object)current); } } break; } finally { if (enumerator2 is IDisposable disposable) { disposable.Dispose(); } } case MergeArrayHandling.Replace: target.ClearItems(); IEnumerator enumerator3 = content.GetEnumerator(); try { while (enumerator3.MoveNext()) { JToken current = (JToken)enumerator3.Current; target.Add((object)current); } break; } finally { if (enumerator3 is IDisposable disposable) { disposable.Dispose(); } } case MergeArrayHandling.Merge: int num = 0; IEnumerator enumerator4 = content.GetEnumerator(); try { while (enumerator4.MoveNext()) { object current = enumerator4.Current; if (num < target.Count) { if (target[(object)num] is JContainer jcontainer) { jcontainer.Merge(current, settings); } else if (current != null) { JToken fromContent = JContainer.CreateFromContent(current); if (fromContent.Type != JTokenType.Null) { target[(object)num] = fromContent; } } } else { target.Add(current); } ++num; } break; } finally { if (enumerator4 is IDisposable disposable) { disposable.Dispose(); } } default: throw new ArgumentOutOfRangeException(nameof(settings), "Unexpected merge array handling when merging JSON."); } }
public static void MergeHsanFiles(string srcPath, string songPackName, string destPath) { //Load hsan manifest var hsanFiles = Directory.EnumerateFiles(srcPath, "*.hsan", SearchOption.AllDirectories).ToArray(); if (hsanFiles.Length < 1) throw new DataException("No songs_*.hsan file found."); // merge multiple hsan files into a single hsan file if (hsanFiles.Length > 1) { var mergeSettings = new JsonMergeSettings { MergeArrayHandling = MergeArrayHandling.Union }; JObject hsanObject1 = new JObject(); foreach (var hsan in hsanFiles) { JObject hsanObject2 = JObject.Parse(File.ReadAllText(hsan)); hsanObject1.Merge(hsanObject2, mergeSettings); } var hsanFileName = String.Format("songs_dlc_{0}.hsan", songPackName.ToLower()); var hsanPath = Path.Combine(destPath, hsanFileName); string json = JsonConvert.SerializeObject(hsanObject1, Formatting.Indented); File.WriteAllText(hsanPath, json); // delete old hsan files foreach (var hsan in hsanFiles) File.Delete(hsan); } }
/// <summary> /// Returns a JSON object that represents the current <see cref="Metal.FrontEnd.Lex.Token"/>. /// </summary> /// <returns>The JSON object.</returns> public object ToJson() { String val; switch (type) { case TokenType.StringLiteral: case TokenType.Identifier: case TokenType.Keyword: case TokenType.Operator: case TokenType.AtPunctuation: case TokenType.ColonPunctuation: case TokenType.CommaPunctuation: case TokenType.LeftBracePunctuation: case TokenType.LeftBracketPunctuation: case TokenType.LeftParenthesisPunctuation: case TokenType.RightBracePunctuation: case TokenType.RightBracketPunctuation: case TokenType.RightParenthesisPunctuation: case TokenType.SemiColonPunctuation: val = "\"" + value + "\""; break; case TokenType.IntegerLiteral: case TokenType.FloatingPointLiteral: case TokenType.BooleanLiteral: val = value; break; default: val = ""; break; } var str = string.Format ("{{ \"token\": {{ \"type\": \"{0}\", \"value\": {1}, \"isReserved\": {2} }} }}", Name, val, IsReserved (val).ToString ().ToLower ()); var mergeSettings = new JsonMergeSettings { MergeArrayHandling = MergeArrayHandling.Union }; var json = JObject.Parse (str); json.Merge (source.ToJson (), mergeSettings); return json; }
/// <summary> /// Tries to load custom settings and if one is find, tries to merge them to the given default settings. /// </summary> /// <param name="defaultSettings">The default settings with which to merge the ones.</param> /// <returns>The result settings after merge.</returns> private static TestEnvironmentSettings TryLoadAndMergeWithCustomSettings(TestEnvironmentSettings defaultSettings) { string customTestSettingsFileLocation = System.Environment.GetEnvironmentVariable(EnvVariableForCustomSettingLocation, EnvironmentVariableTarget.User) ?? FallBackCustomTestSettingsFileLocation; var codeBaseUrl = new Uri(Assembly.GetExecutingAssembly().CodeBase); var codeBasePath = Uri.UnescapeDataString(codeBaseUrl.AbsolutePath); var dirPath = Path.GetDirectoryName(codeBasePath); var customFileLoc = Path.Combine(dirPath, customTestSettingsFileLocation); var finalSettings = JObject.FromObject(defaultSettings); if(File.Exists(customFileLoc)) { //TODO: Print that parsing custom values... var mergeSettings = new JsonMergeSettings { MergeArrayHandling = MergeArrayHandling.Union }; var customSettingsJson = JObject.Parse(File.ReadAllText(customFileLoc)); customSettingsJson.Merge(finalSettings, mergeSettings); finalSettings = customSettingsJson; } return finalSettings.ToObject<TestEnvironmentSettings>(); }
internal static void MergeEnumerableContent(JContainer target, IEnumerable content, JsonMergeSettings settings) { IEnumerator enumerator; IDisposable disposable; switch (settings.MergeArrayHandling) { case MergeArrayHandling.Concat: { enumerator = content.GetEnumerator(); try { while (enumerator.MoveNext()) { target.Add((JToken)enumerator.Current); } break; } finally { disposable = enumerator as IDisposable; if (disposable != null) { disposable.Dispose(); } } break; } case MergeArrayHandling.Union: { HashSet <JToken> jTokens = new HashSet <JToken>(target, JToken.EqualityComparer); enumerator = content.GetEnumerator(); try { while (enumerator.MoveNext()) { JToken current = (JToken)enumerator.Current; if (!jTokens.Add(current)) { continue; } target.Add(current); } break; } finally { disposable = enumerator as IDisposable; if (disposable != null) { disposable.Dispose(); } } break; } case MergeArrayHandling.Replace: { target.ClearItems(); enumerator = content.GetEnumerator(); try { while (enumerator.MoveNext()) { target.Add((JToken)enumerator.Current); } break; } finally { disposable = enumerator as IDisposable; if (disposable != null) { disposable.Dispose(); } } break; } case MergeArrayHandling.Merge: { int num = 0; enumerator = content.GetEnumerator(); try { while (enumerator.MoveNext()) { object obj = enumerator.Current; if (num >= target.Count) { target.Add(obj); } else { JContainer item = target[num] as JContainer; if (item != null) { item.Merge(obj, settings); } else if (obj != null) { JToken jTokens1 = JContainer.CreateFromContent(obj); if (jTokens1.Type != JTokenType.Null) { target[num] = jTokens1; } } } num++; } break; } finally { disposable = enumerator as IDisposable; if (disposable != null) { disposable.Dispose(); } } break; } default: { throw new ArgumentOutOfRangeException("settings", "Unexpected merge array handling when merging JSON."); } } }
private static JObject MergeJsonStrings(string filePath) { var mergeSettings = new JsonMergeSettings { MergeArrayHandling = MergeArrayHandling.Union }; JObject jsonObject = null; try { string line; using (var file = new StreamReader(filePath)) { while ((line = file.ReadLine()) != null) { if (jsonObject != null) { jsonObject.Merge(JObject.Parse(line), mergeSettings); } else { jsonObject = JObject.Parse(line); } } } } catch (Exception error) { Jarvis.Logger.Error(error); return null; } return jsonObject; }
// Token: 0x060008C3 RID: 2243 // RVA: 0x0003D528 File Offset: 0x0003B728 internal override void MergeItem(object content, JsonMergeSettings settings) { JConstructor jConstructor = content as JConstructor; if (jConstructor == null) { return; } if (jConstructor.Name != null) { this.Name = jConstructor.Name; } JContainer.MergeEnumerableContent(this, jConstructor, settings); }
internal abstract void MergeItem(object content, JsonMergeSettings settings);
/// <summary> /// Merge zweier Arrays /// </summary> /// <param name="iTarget"></param> /// <param name="iTemplate"></param> private void MergeTemplate(JArray iTarget, JArray iTemplate) { JsonMergeSettings lMergeSettings = new JsonMergeSettings(); lMergeSettings.MergeArrayHandling = MergeArrayHandling.Union; if (iTemplate.First.Type == JTokenType.Array) { for (int i = 0; i < iTemplate.Count && i < iTarget.Count; i++) { //(iTarget[i] as JArray).Merge(iTemplate[i], lMergeSettings); //iTemplate[i].Remove(); (iTemplate[i] as JArray).Merge(iTarget[i], lMergeSettings); iTarget[i].Remove(); } } //iTarget.Merge(iTemplate, lMergeSettings); iTemplate.Merge(iTarget, lMergeSettings); iTarget.RemoveAll(); iTarget.Add(iTemplate.Children()); }
/// <summary> /// Merge the specified content into this <see cref="JToken"/> using <see cref="JsonMergeSettings"/>. /// </summary> /// <param name="content">The content to be merged.</param> /// <param name="settings">The <see cref="JsonMergeSettings"/> used to merge the content.</param> public void Merge(object content, JsonMergeSettings settings) { MergeItem(content, settings); }
internal static void MergeEnumerableContent(JContainer target, IEnumerable content, JsonMergeSettings settings) { switch (settings.MergeArrayHandling) { case MergeArrayHandling.Concat: foreach (JToken token in content) { target.Add(token); } break; case MergeArrayHandling.Union: { HashSet <JToken> set = new HashSet <JToken>(target, JToken.EqualityComparer); foreach (JToken token2 in content) { if (set.Add(token2)) { target.Add(token2); } } break; } case MergeArrayHandling.Replace: target.ClearItems(); foreach (JToken token3 in content) { target.Add(token3); } break; case MergeArrayHandling.Merge: { int num = 0; foreach (object obj2 in content) { if (num < target.Count) { JContainer container = target[num] as JContainer; if (container != null) { container.Merge(obj2, settings); } else if (obj2 != null) { JToken token4 = CreateFromContent(obj2); if (token4.Type != JTokenType.Null) { target[num] = token4; } } } else { target.Add(obj2); } num++; } break; } default: throw new ArgumentOutOfRangeException("settings", "Unexpected merge array handling when merging JSON."); } }