雷达智富

首页 > 内容 > 程序笔记 > 正文

程序笔记

vscode中自动将json格式的内容自动生成对应的代码

2024-09-05 80

JSON是各种编程语言中都很常用的数据格式,如Java,JavaScript,C#等语言中都常用JSON传输数据或保存一些配置信息,要序列化或反序列化字符串,在代码中需要有对应与JSON内容的类才方便实现。vscode是非常强大的插件化编辑(甚至可以称之为开发环境了),在vscode中,通过两个插件可以非常方便的根据写好的JSON数据内容,自动生成对应的序列化的类。

安装插件

在vscode Extensions管理中搜索“JSON”关键字,先安装JSON支持插件“JSON”,如下图:
image-1657876143947

然后,安装“Paste JSON as Code”插件,如下图:
image-1657876215356
该插件支持由JSON生成TypeScript, Python, Go, Ruby, C#, Java, Swift, Rust, Kotlin, C++, Flow, Objective-C, JavaScript, Elm 和 JSON Schema语言的代码。

JSON生成C#的代码

这里以转换为C#的代码为例,假设JSON的文本内容如下:

{
    user: Jame,
    ege : 19
}

拷贝JSON内容到剪贴板,然后使用“F1”快捷键,搜索“Paste JSON as Code”,如下图:
image-1657876483150
直接单击“Paste JSON as Code”,此时,会提示代码文件的文件名,此处输入test.cs,然后回车,插件就会自动将剪贴板中的JSON转换为序列化/反序列化的C#代码,转换后的代码如下:

// Generated by https://quicktype.io

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

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

    public partial class TestCs
    {
        [JsonProperty(user)]
        public string User { get; set; }

        [JsonProperty(ege)]
        [JsonConverter(typeof(ParseStringConverter))]
        public long Ege { get; set; }
    }

    public partial class TestCs
    {
        public static TestCs FromJson(string json) = JsonConvert.DeserializeObjectTestCs(json, QuickType.Converter.Settings);
    }

    public static class Serialize
    {
        public static string ToJson(this TestCs 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 = {
                new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
            },
        };
    }

    internal class ParseStringConverter : JsonConverter
    {
        public override bool CanConvert(Type t) = t == typeof(long) || t == typeof(long?);

        public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
        {
            if (reader.TokenType == JsonToken.Null) return null;
            var value = serializer.Deserializestring(reader);
            long l;
            if (Int64.TryParse(value, out l))
            {
                return l;
            }
            throw new Exception(Cannot unmarshal type long);
        }

        public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
        {
            if (untypedValue == null)
            {
                serializer.Serialize(writer, null);
                return;
            }
            var value = (long)untypedValue;
            serializer.Serialize(writer, value.ToString());
            return;
        }

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

以上代码,自动使用了NewtonJSON库进行序列化和反序列化操作,在实际工程中需要引入NewtonJson才能正常使用。生成的代码也是一个很简洁并高效的代码模板,自动生成了静态方法,直接使用对象名.Serialize()就可以直接将对象进行序列化操作。

更新于:2个月前
赞一波!

文章评论

评论问答