将Typescript(List)转换为C#List?

问题描述 投票:0回答:1

我正在为游戏编写工具。这个游戏有一个项目列表。我能找到的唯一一个列出这些项目及其统计数据的来源是.ts typescript文件:https://github.com/hondasmx/ngu_armory/blob/master/src/app/servises/items.ts

我只需要在C#中使用此列表。我以前从未听说过TypeScript(看起来很酷),只需要继续使用这些数据。谷歌没有太大的帮助,我找到了一些工具,即quicktype尝试直接转换。我能够使用QuickType获取以下C#代码:

// <auto-generated />
//
// To parse this JSON data, add NuGet 'Newtonsoft.Json' then do one of these:
//
//    using QuickType;
//
//    var item = Item.FromJson(jsonString);
//    var itemStat = ItemStat.FromJson(jsonString);
//    var slot = Slot.FromJson(jsonString);
//    var stat = Stat.FromJson(jsonString);
//    var setName = SetName.FromJson(jsonString);

namespace QuickType
{
    using System;
    using System.Collections.Generic;

    using System.Globalization;
    using Newtonsoft.Json;
    using Newtonsoft.Json.Converters;

    public partial class Item
    {
        [JsonProperty("img", NullValueHandling = NullValueHandling.Ignore)]
        public string Img { get; set; }

        [JsonProperty("isEquippedInAccs", NullValueHandling = NullValueHandling.Ignore)]
        public bool? IsEquippedInAccs { get; set; }

        [JsonProperty("isEquippedInArmory", NullValueHandling = NullValueHandling.Ignore)]
        public bool? IsEquippedInArmory { get; set; }

        [JsonProperty("itemLevel", NullValueHandling = NullValueHandling.Ignore)]
        public double? ItemLevel { get; set; }

        [JsonProperty("name")]
        public string Name { get; set; }

        [JsonProperty("setName", NullValueHandling = NullValueHandling.Ignore)]
        public SetNameEnum? SetName { get; set; }

        [JsonProperty("slot")]
        public SlotEnum Slot { get; set; }

        [JsonProperty("stats")]
        public List<ItemStat> Stats { get; set; }
    }

    public partial class ItemStat
    {
        [JsonProperty("stat")]
        public StatEnum Stat { get; set; }

        [JsonProperty("value")]
        public double Value { get; set; }
    }

    public enum SetNameEnum { BadlyDrawnSet, BeardverseSet, CaveSet, ChocoSet, ClockSet, EdgySet, ForestPendants, ForestSet, GaudySet, GrbSet, GreasyNerdSet, Hearts, HsbSet, JakeSet, Looty, MegaSet, MetaSet, MobsterSet, Other, PartySet, PrettyPinkPrincessSet, SReredneWSet, SewersSet, SlimySet, SpoopySet, StealthSet, The2DSet, TrainingSet, UugRings, WandererSSet };

    public enum SlotEnum { Accessory, Armor, Boots, Head, Pants, Weapon };

    public enum StatEnum { AdvanceTraining, Ap, AugmentSpeed, BeardSpeed, DaycareSpeed, DropChance, EnergyBars, EnergyCap, EnergyPower, EnergySpeed, Experience, GoldDrops, MagicBars, MagicCap, MagicPower, MagicSpeed, MoveCooldown, NguSpeed, Power, QuestDrops, Respawn, SeedGain, Toughness, WandoosSpeed, YggdrasilYeild };

    public partial class Item
    {
        public static Item FromJson(string json) => JsonConvert.DeserializeObject<Item>(json, QuickType.Converter.Settings);
    }

    public partial class ItemStat
    {
        public static ItemStat FromJson(string json) => JsonConvert.DeserializeObject<ItemStat>(json, QuickType.Converter.Settings);
    }

    public class Slot
    {
        public static SlotEnum FromJson(string json) => JsonConvert.DeserializeObject<SlotEnum>(json, QuickType.Converter.Settings);
    }

    public class Stat
    {
        public static StatEnum FromJson(string json) => JsonConvert.DeserializeObject<StatEnum>(json, QuickType.Converter.Settings);
    }

    public class SetName
    {
        public static SetNameEnum FromJson(string json) => JsonConvert.DeserializeObject<SetNameEnum>(json, QuickType.Converter.Settings);
    }

    public static class Serialize
    {
        public static string ToJson(this Item self) => JsonConvert.SerializeObject(self, QuickType.Converter.Settings);
        public static string ToJson(this ItemStat self) => JsonConvert.SerializeObject(self, QuickType.Converter.Settings);
        public static string ToJson(this SlotEnum self) => JsonConvert.SerializeObject(self, QuickType.Converter.Settings);
        public static string ToJson(this StatEnum self) => JsonConvert.SerializeObject(self, QuickType.Converter.Settings);
        public static string ToJson(this SetNameEnum self) => JsonConvert.SerializeObject(self, QuickType.Converter.Settings);
    }

    internal static class Converter
    {
        public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
        {
            MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
            DateParseHandling = DateParseHandling.None,
            Converters =
            {
                SetNameEnumConverter.Singleton,
                SlotEnumConverter.Singleton,
                StatEnumConverter.Singleton,
                new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
            },
        };
    }

    internal class SetNameEnumConverter : JsonConverter
    {
        public override bool CanConvert(Type t) => t == typeof(SetNameEnum) || t == typeof(SetNameEnum?);

        public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
        {
            if (reader.TokenType == JsonToken.Null) return null;
            var value = serializer.Deserialize<string>(reader);
            switch (value)
            {
                case "2D Set":
                    return SetNameEnum.The2DSet;
                case "Badly Drawn Set":
                    return SetNameEnum.BadlyDrawnSet;
                case "Beardverse Set":
                    return SetNameEnum.BeardverseSet;
                case "Cave Set":
                    return SetNameEnum.CaveSet;
                case "Choco Set":
                    return SetNameEnum.ChocoSet;
                case "Clock Set":
                    return SetNameEnum.ClockSet;
                case "Edgy Set":
                    return SetNameEnum.EdgySet;
                case "Forest Pendants":
                    return SetNameEnum.ForestPendants;
                case "Forest Set":
                    return SetNameEnum.ForestSet;
                case "GRB Set":
                    return SetNameEnum.GrbSet;
                case "Gaudy Set":
                    return SetNameEnum.GaudySet;
                case "Greasy Nerd Set":
                    return SetNameEnum.GreasyNerdSet;
                case "HSB Set":
                    return SetNameEnum.HsbSet;
                case "Hearts":
                    return SetNameEnum.Hearts;
                case "Jake Set":
                    return SetNameEnum.JakeSet;
                case "Looty":
                    return SetNameEnum.Looty;
                case "Mega Set":
                    return SetNameEnum.MegaSet;
                case "Meta Set":
                    return SetNameEnum.MetaSet;
                case "Mobster Set":
                    return SetNameEnum.MobsterSet;
                case "Other":
                    return SetNameEnum.Other;
                case "Party Set":
                    return SetNameEnum.PartySet;
                case "Pretty Pink Princess Set":
                    return SetNameEnum.PrettyPinkPrincessSet;
                case "Sewers Set":
                    return SetNameEnum.SewersSet;
                case "Slimy Set":
                    return SetNameEnum.SlimySet;
                case "Spoopy Set":
                    return SetNameEnum.SpoopySet;
                case "Stealth Set":
                    return SetNameEnum.StealthSet;
                case "Training Set":
                    return SetNameEnum.TrainingSet;
                case "UUG Rings":
                    return SetNameEnum.UugRings;
                case "Wanderer's Set":
                    return SetNameEnum.WandererSSet;
                case "s'reredneW Set":
                    return SetNameEnum.SReredneWSet;
            }
            throw new Exception("Cannot unmarshal type SetNameEnum");
        }

        public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
        {
            if (untypedValue == null)
            {
                serializer.Serialize(writer, null);
                return;
            }
            var value = (SetNameEnum)untypedValue;
            switch (value)
            {
                case SetNameEnum.The2DSet:
                    serializer.Serialize(writer, "2D Set");
                    return;
                case SetNameEnum.BadlyDrawnSet:
                    serializer.Serialize(writer, "Badly Drawn Set");
                    return;
                case SetNameEnum.BeardverseSet:
                    serializer.Serialize(writer, "Beardverse Set");
                    return;
                case SetNameEnum.CaveSet:
                    serializer.Serialize(writer, "Cave Set");
                    return;
                case SetNameEnum.ChocoSet:
                    serializer.Serialize(writer, "Choco Set");
                    return;
                case SetNameEnum.ClockSet:
                    serializer.Serialize(writer, "Clock Set");
                    return;
                case SetNameEnum.EdgySet:
                    serializer.Serialize(writer, "Edgy Set");
                    return;
                case SetNameEnum.ForestPendants:
                    serializer.Serialize(writer, "Forest Pendants");
                    return;
                case SetNameEnum.ForestSet:
                    serializer.Serialize(writer, "Forest Set");
                    return;
                case SetNameEnum.GrbSet:
                    serializer.Serialize(writer, "GRB Set");
                    return;
                case SetNameEnum.GaudySet:
                    serializer.Serialize(writer, "Gaudy Set");
                    return;
                case SetNameEnum.GreasyNerdSet:
                    serializer.Serialize(writer, "Greasy Nerd Set");
                    return;
                case SetNameEnum.HsbSet:
                    serializer.Serialize(writer, "HSB Set");
                    return;
                case SetNameEnum.Hearts:
                    serializer.Serialize(writer, "Hearts");
                    return;
                case SetNameEnum.JakeSet:
                    serializer.Serialize(writer, "Jake Set");
                    return;
                case SetNameEnum.Looty:
                    serializer.Serialize(writer, "Looty");
                    return;
                case SetNameEnum.MegaSet:
                    serializer.Serialize(writer, "Mega Set");
                    return;
                case SetNameEnum.MetaSet:
                    serializer.Serialize(writer, "Meta Set");
                    return;
                case SetNameEnum.MobsterSet:
                    serializer.Serialize(writer, "Mobster Set");
                    return;
                case SetNameEnum.Other:
                    serializer.Serialize(writer, "Other");
                    return;
                case SetNameEnum.PartySet:
                    serializer.Serialize(writer, "Party Set");
                    return;
                case SetNameEnum.PrettyPinkPrincessSet:
                    serializer.Serialize(writer, "Pretty Pink Princess Set");
                    return;
                case SetNameEnum.SewersSet:
                    serializer.Serialize(writer, "Sewers Set");
                    return;
                case SetNameEnum.SlimySet:
                    serializer.Serialize(writer, "Slimy Set");
                    return;
                case SetNameEnum.SpoopySet:
                    serializer.Serialize(writer, "Spoopy Set");
                    return;
                case SetNameEnum.StealthSet:
                    serializer.Serialize(writer, "Stealth Set");
                    return;
                case SetNameEnum.TrainingSet:
                    serializer.Serialize(writer, "Training Set");
                    return;
                case SetNameEnum.UugRings:
                    serializer.Serialize(writer, "UUG Rings");
                    return;
                case SetNameEnum.WandererSSet:
                    serializer.Serialize(writer, "Wanderer's Set");
                    return;
                case SetNameEnum.SReredneWSet:
                    serializer.Serialize(writer, "s'reredneW Set");
                    return;
            }
            throw new Exception("Cannot marshal type SetNameEnum");
        }

        public static readonly SetNameEnumConverter Singleton = new SetNameEnumConverter();
    }

    internal class SlotEnumConverter : JsonConverter
    {
        public override bool CanConvert(Type t) => t == typeof(SlotEnum) || t == typeof(SlotEnum?);

        public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
        {
            if (reader.TokenType == JsonToken.Null) return null;
            var value = serializer.Deserialize<string>(reader);
            switch (value)
            {
                case "Accessory":
                    return SlotEnum.Accessory;
                case "Armor":
                    return SlotEnum.Armor;
                case "Boots":
                    return SlotEnum.Boots;
                case "Head":
                    return SlotEnum.Head;
                case "Pants":
                    return SlotEnum.Pants;
                case "Weapon":
                    return SlotEnum.Weapon;
            }
            throw new Exception("Cannot unmarshal type SlotEnum");
        }

        public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
        {
            if (untypedValue == null)
            {
                serializer.Serialize(writer, null);
                return;
            }
            var value = (SlotEnum)untypedValue;
            switch (value)
            {
                case SlotEnum.Accessory:
                    serializer.Serialize(writer, "Accessory");
                    return;
                case SlotEnum.Armor:
                    serializer.Serialize(writer, "Armor");
                    return;
                case SlotEnum.Boots:
                    serializer.Serialize(writer, "Boots");
                    return;
                case SlotEnum.Head:
                    serializer.Serialize(writer, "Head");
                    return;
                case SlotEnum.Pants:
                    serializer.Serialize(writer, "Pants");
                    return;
                case SlotEnum.Weapon:
                    serializer.Serialize(writer, "Weapon");
                    return;
            }
            throw new Exception("Cannot marshal type SlotEnum");
        }

        public static readonly SlotEnumConverter Singleton = new SlotEnumConverter();
    }

    internal class StatEnumConverter : JsonConverter
    {
        public override bool CanConvert(Type t) => t == typeof(StatEnum) || t == typeof(StatEnum?);

        public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
        {
            if (reader.TokenType == JsonToken.Null) return null;
            var value = serializer.Deserialize<string>(reader);
            switch (value)
            {
                case "AP":
                    return StatEnum.Ap;
                case "Advance Training":
                    return StatEnum.AdvanceTraining;
                case "Augment Speed":
                    return StatEnum.AugmentSpeed;
                case "Beard Speed":
                    return StatEnum.BeardSpeed;
                case "Daycare Speed":
                    return StatEnum.DaycareSpeed;
                case "Drop Chance":
                    return StatEnum.DropChance;
                case "Energy Bars":
                    return StatEnum.EnergyBars;
                case "Energy Cap":
                    return StatEnum.EnergyCap;
                case "Energy Power":
                    return StatEnum.EnergyPower;
                case "Energy Speed":
                    return StatEnum.EnergySpeed;
                case "Experience":
                    return StatEnum.Experience;
                case "Gold Drops":
                    return StatEnum.GoldDrops;
                case "Magic Bars":
                    return StatEnum.MagicBars;
                case "Magic Cap":
                    return StatEnum.MagicCap;
                case "Magic Power":
                    return StatEnum.MagicPower;
                case "Magic Speed":
                    return StatEnum.MagicSpeed;
                case "Move Cooldown":
                    return StatEnum.MoveCooldown;
                case "NGU Speed":
                    return StatEnum.NguSpeed;
                case "Power":
                    return StatEnum.Power;
                case "Quest Drops":
                    return StatEnum.QuestDrops;
                case "Respawn":
                    return StatEnum.Respawn;
                case "Seed Gain":
                    return StatEnum.SeedGain;
                case "Toughness":
                    return StatEnum.Toughness;
                case "Wandoos Speed":
                    return StatEnum.WandoosSpeed;
                case "Yggdrasil Yeild":
                    return StatEnum.YggdrasilYeild;
            }
            throw new Exception("Cannot unmarshal type StatEnum");
        }

        public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
        {
            if (untypedValue == null)
            {
                serializer.Serialize(writer, null);
                return;
            }
            var value = (StatEnum)untypedValue;
            switch (value)
            {
                case StatEnum.Ap:
                    serializer.Serialize(writer, "AP");
                    return;
                case StatEnum.AdvanceTraining:
                    serializer.Serialize(writer, "Advance Training");
                    return;
                case StatEnum.AugmentSpeed:
                    serializer.Serialize(writer, "Augment Speed");
                    return;
                case StatEnum.BeardSpeed:
                    serializer.Serialize(writer, "Beard Speed");
                    return;
                case StatEnum.DaycareSpeed:
                    serializer.Serialize(writer, "Daycare Speed");
                    return;
                case StatEnum.DropChance:
                    serializer.Serialize(writer, "Drop Chance");
                    return;
                case StatEnum.EnergyBars:
                    serializer.Serialize(writer, "Energy Bars");
                    return;
                case StatEnum.EnergyCap:
                    serializer.Serialize(writer, "Energy Cap");
                    return;
                case StatEnum.EnergyPower:
                    serializer.Serialize(writer, "Energy Power");
                    return;
                case StatEnum.EnergySpeed:
                    serializer.Serialize(writer, "Energy Speed");
                    return;
                case StatEnum.Experience:
                    serializer.Serialize(writer, "Experience");
                    return;
                case StatEnum.GoldDrops:
                    serializer.Serialize(writer, "Gold Drops");
                    return;
                case StatEnum.MagicBars:
                    serializer.Serialize(writer, "Magic Bars");
                    return;
                case StatEnum.MagicCap:
                    serializer.Serialize(writer, "Magic Cap");
                    return;
                case StatEnum.MagicPower:
                    serializer.Serialize(writer, "Magic Power");
                    return;
                case StatEnum.MagicSpeed:
                    serializer.Serialize(writer, "Magic Speed");
                    return;
                case StatEnum.MoveCooldown:
                    serializer.Serialize(writer, "Move Cooldown");
                    return;
                case StatEnum.NguSpeed:
                    serializer.Serialize(writer, "NGU Speed");
                    return;
                case StatEnum.Power:
                    serializer.Serialize(writer, "Power");
                    return;
                case StatEnum.QuestDrops:
                    serializer.Serialize(writer, "Quest Drops");
                    return;
                case StatEnum.Respawn:
                    serializer.Serialize(writer, "Respawn");
                    return;
                case StatEnum.SeedGain:
                    serializer.Serialize(writer, "Seed Gain");
                    return;
                case StatEnum.Toughness:
                    serializer.Serialize(writer, "Toughness");
                    return;
                case StatEnum.WandoosSpeed:
                    serializer.Serialize(writer, "Wandoos Speed");
                    return;
                case StatEnum.YggdrasilYeild:
                    serializer.Serialize(writer, "Yggdrasil Yeild");
                    return;
            }
            throw new Exception("Cannot marshal type StatEnum");
        }

        public static readonly StatEnumConverter Singleton = new StatEnumConverter();
    }
}

这将是非常有用的,但我看不到任何方法来获得该列表。我尝试使用FromJSON函数,但它不理解TypeScript。因此,即使将此TS列表转换为JSON的方法也可能让我排序。

此时,手动输入所有数据会更快。救命?

c# typescript
1个回答
0
投票

由于该列表还包含枚举,因此在其上创建和替换以创建有效的JSON可能会变得乏味。

相反,您可以安装一个打字稿编译器,使用它将该列表转换为有效的JSON并保存。

第一个要求是NodeJS。 一旦安装完成,install Typescriptnpm install -g typescript输入您的终端。 或者,您也可以安装ts-node npm install -g ts-node直接运行typescript代码。

现在复制您链接的代码,将其粘贴到新文档中,并在其末尾添加console.log(JSON.stringify(items));。将文件保存为itemList.ts某处,然后在该位置打开终端(使用cmd和PowerShell测试)并输入

tsc .\itemList.ts 
node .\itemList.js > out.json

或者,如果您安装了ts节点

ts-node .\itemList.ts > out.json

ts-node只是让您跳过将TypeScript编译为JavaScript。

您应该在同一目录中获得一个名为out.json的文件,该文件包含有效的JSON数据,这些数据应该能够被生成的类中的FromJSON方法读取。

© www.soinside.com 2019 - 2024. All rights reserved.