精华内容
下载资源
问答
  • 2021-12-01 17:36:01

    调用json.dumps()方法时,偶尔会出现类似TypeError: Object of type int64 is not JSON serializable的错误,这是由于json无法对结果进行序列化导致的,可以通过自定义序列化方法解决问题;
    1.首先,继承json.JSONEncoder,自定义序列化方法(内部if可以自行添加所需要转化的数据类型)
    class NpEncoder(json.JSONEncoder):
    def default(self, obj):
    if isinstance(obj, np.integer):
    return int(obj)
    elif isinstance(obj, np.floating):
    return float(obj)
    elif isinstance(obj, np.ndarray):
    return obj.tolist()
    else:
    return super(NpEncoder, self).default(obj)
    2.使用dumps方法(我们可以直接把dict直接序列化为json对象)加上 cls=NpEncoder,data就可以正常序列化了
    json.dumps(data, cls=NpEncoder)

    更多相关内容
  • javascript时间戳毫秒 Newtonsoft.Json序列化扩展特性 30 /// 31 public class TimestampConverter : JsonConverter 32 { 33 public override bool CanConvert(Type objectType) 34 ...

     

     

     1     public class ChinaDateTimeConverter : DateTimeConverterBase
     2     {
     3         private static IsoDateTimeConverter dtConverter = new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd HH:mm" };
     4 
     5         public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
     6         {
     7             return dtConverter.ReadJson(reader, objectType, existingValue, serializer);
     8         }
     9 
    10         public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    11         {
    12             dtConverter.WriteJson(writer, value, serializer);
    13         }
    14     }
    15     public class WorkTaskNoticeReadsModel
    16     {
    17 
    18         public string UserName { get; set; }
    19 
    20         public string FullName { get; set; }
    21 
    22         public string DeptName { get; set; }
    23 
    24         [JsonConverter(typeof(ChinaDateTimeConverter))]
    25         public DateTime ReadTime { get; set; }
    26     }
    27  
    28     /// <summary>  
    29     /// javascript时间戳毫秒  Newtonsoft.Json序列化扩展特性
    30     /// </summary>  
    31     public class TimestampConverter : JsonConverter
    32     {
    33         public override bool CanConvert(Type objectType)
    34         {
    35             return objectType == typeof(DateTime);
    36         }
    37 
    38         public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    39         {
    40             return ConvertIntDateTime(long.Parse(reader.Value.ToString()));
    41         }
    42 
    43         public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    44         {
    45             writer.WriteValue(ConvertDateTimeInt((DateTime)value));
    46         }
    47 
    48         public DateTime ConvertIntDateTime(long aSeconds)
    49         {
    50             return new DateTime(1970, 1, 1).AddMilliseconds(aSeconds);
    51         }
    52 
    53         public long ConvertDateTimeInt(DateTime aDT)
    54         {
    55             return (long)(aDT - new DateTime(1970, 1, 1)).TotalMilliseconds;
    56         }
    57     }
    58 
    59    public class Person
    60     {
    61         [JsonProperty("name"), JsonConverter(typeof(EmptyStringConverter))]
    62         public string Name { get; set; }
    63 
    64         [JsonProperty("date1"), JsonConverter(typeof(TimestampConverter))]
    65         public DateTime Date1 { get; set; }
    66 
    67         [JsonProperty("date2"), JsonConverter(typeof(TimestampConverter))]
    68         public DateTime Date2 { get; set; }
    69 
    70         [JsonProperty("money"), JsonConverter(typeof(MoneyConverter))]
    71         public decimal Money { get; set; }
    72     }

     

    转载于:https://www.cnblogs.com/zengsm/p/10273346.html

    展开全文
  • 主要介绍了实例解析Json反序列化之ObjectMapper,json自定义序列化的方法,需要的朋友可以了解下。
  • Newtonsoft.Json 自定义序列化字段

    千次阅读 2019-07-01 15:49:54
    class Program { static void Main(string[] args) { var m = new JsonModel() { Id = 0, Name = "nnnn" }; ...
        class Program
        {
            static void Main(string[] args)
            {
                var m = new JsonModel()
                {
                    Id = 0,
                    Name = "nnnn"
                };
    
                var json = JsonConvert.SerializeObject(m, new JsonSerializerSettings()
                {
                    ContractResolver = new MyContractResolver(new List<string>(){ "Id" })
                });
    
                Console.WriteLine(json);
    
            }
        }
        public class JsonModel
        {
            [JsonProperty("myId")]
            public int Id { get; set; }
            public string Name { get; set; }
        }
        public class MyContractResolver : DefaultContractResolver
        {
            private List<string> _names = null;
            public MyContractResolver(List<string> names)
            {
                _names = names;
            }
            protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
            {
                string name = member.Name;
                if (_names.Contains(name))
                return base.CreateProperty(member, memberSerialization);
                return null;
            }
        }

     

    展开全文
  • 需求背景 需求一:SpringMVC构建的微服务系统,数据库对日期的存储是Long类型的时间戳,前端之前是默认使用Long类型时间,现在前端框架改动,要求后端响应数据时,Long类型的...需求二:前端请求上传的JSON报文,Str

    需求背景

    需求一:SpringMVC构建的微服务系统,数据库对日期的存储是Long类型的时间戳,前端之前是默认使用Long类型时间,现在前端框架改动,要求后端响应数据时,Long类型的时间自动变成标准时间格式(yyyy-MM-dd HH:mm:ss)。

    涉及到这个转换的范围挺大,所有的实体表都有创建时间createTime和修改时间updateTime,目前的主要诉求也是针对这两个字段,并且在实体详情数据和列表数据都存在,需要一个统一的方法,对这两个字段进行处理。

    需求二:前端请求上传的JSON报文,String类型的内容,可能会出现前后有空格的现象,如果前端框架未对此问题进行处理,后端收到的JSON请求反序列化为对象时,就会出现String类型的值,前后有空格,现需要一个统一的处理方法,对接收的String类型属性执行trim方法。

    解决方案

    SpringMVC默认的JSON框架为jackson,也可以使用fastjson。

    jackson框架

    自定义序列化

    如果项目使用jackson框架做json序列化,推荐的方案是使用@JsonSerialize注解,示例代码如下:

    @JsonSerialize(using = CustomDateSerializer.class)  
    private Long createTime;
    
    @JsonSerialize(using = CustomDateSerializer.class)  
    private Long updateTime;
    

    CustomDateSerializer类的实现示例如下:

    public class CustomDateSerializer extends JsonSerializer<Long> {
    
    	@Override
    	public void serialize(Long aLong, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
    		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    		Date date = new Date(aLong);
    		jsonGenerator.writeString(sdf.format(date));
    	}
    }
    

    这种方案的好处如下:

    1. 自定义的实现类可以复用
    2. 精准到需要转换处理的字段,不受限于createTime和updateTime,更贴近于需求

    缺点就是需要转换的字段都需要使用注解,工作量有点大

    当然有其他的统一处理方案,这里不赘述。

    自定义反序列化

    在jackson框架上实现自定义序列化,也是非常方便的,继承SimpleModule类即可:

    @Component
    public class StringTrimModule extends SimpleModule {
    
        public StringTrimModule() {
            addDeserializer(String.class, new StdScalarDeserializer<String>(String.class) {
                @Override
                public String deserialize(JsonParser jsonParser, DeserializationContext ctx) throws IOException {
                    String value = jsonParser.getValueAsString();
                    if (StringUtils.isEmpty(value)) {
                         return value;
                    }
                    return value.trim();
                }
            });
        }
    }
    

    fastjson框架

    如果工程里出现这个依赖:

    <dependency>
    	<groupId>com.alibaba</groupId>
    	<artifactId>fastjson</artifactId>
    	<version>1.2.62</version>
    </dependency>
    

    说明此工程使用的json框架为fastjson,那么jackson的@JsonSerialize就不会有触发入口了,我们来看看fastjson的处理方式。

    自定义序列化

    相应的,使用fastjson会有相应的配置类,示例如下:

    /**
     * 统一输出是采用fastJson
     *
     * @return
     */
    @Bean
    public HttpMessageConverters fastJsonHttpMessageConverters() {
    	//convert转换消息的对象
    	FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
    
    	//处理中文乱码问题
    	List<MediaType> fastMediaTypes = new ArrayList<>();
    	fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
    	fastConverter.setSupportedMediaTypes(fastMediaTypes);
    
    	//是否要格式化返回的json数据
    	FastJsonConfig fastJsonConfig = new FastJsonConfig();
    	fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
    	// 添加指定字段的值转换处理
        fastJsonConfig.setSerializeFilters(new CustomerDateFilter());
    	// FastJson禁用autoTypeSupport
    	fastJsonConfig.getParserConfig().setAutoTypeSupport(false);
    	fastConverter.setFastJsonConfig(fastJsonConfig);
    
    	return new HttpMessageConverters(fastConverter);
    }
    

    这里需要添加fastjson对字段值的处理(上述代码已添加这行代码),如

    // 添加指定字段的值转换处理
    fastJsonConfig.setSerializeFilters(new CustomerDateFilter());
    

    CustomerDateFilter为自行实现的类,代码如下:

    public class CustomerDateFilter implements ValueFilter {
    
    	@Override
    	public Object process(Object object, String name, Object value) {
    		if (FieldConstants.CREATE_TIME.equalsIgnoreCase(name) ||  FieldConstants.UPDATE_TIME.equalsIgnoreCase(name)) {
    			// 属性名为createTime, updateTime进行转换处理
    			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    			sdf.setTimeZone(TimeZone.getTimeZone("GMT+8"));
    
    			if(value instanceof Long) {
    				Long time = (Long) value;
    				Date date = new Date(time);
    				return sdf.format(date);
    			} else {
    				return value;
    			}
    		}
    		return value;
    	}
    }
    

    这样就可以把所有响应对象中出现的createTime和updateTime字段统一处理了,无论列表数据还是单个对象数据,非常方便。缺点就是除此之外的字段,如果还做不到全系统统一,就需要单独处理。

    SerializeFilter定制序列化

    支持SerializeFilter定制序列化的扩展编程接口有以下几个,可根据实际需要进行扩展:

    • PropertyPreFilter: 根据PropertyName判断是否序列化;
    • PropertyFilter: 根据PropertyName和PropertyValue来判断是否序列化;
    • NameFilter: 修改Key,如果需要修改Key,process返回值则可;
    • ValueFilter: 修改Value;
    • BeforeFilter: 序列化时在最前添加内容;
    • AfterFilter: 序列化时在最后添加内容;
    自定义反序列化

    fastJson提供了序列化过滤器,来实现自定义序列化改造,但没有提供反序列化过滤器,来实现对应的功能。

    方案:@JSONField注解

    回到对JSON报文String类型的值执行trim操作,官网支持@JSONField注解的属性设置(要求fastJson版本1.2.36以上):

    @JSONField(format="trim")
    private String name;
    

    在JSON报文反序列化时,该实体的name属性会自动执行trim方法进行处理。

    此方案只有逐个添加注解,工作量较大。

    方案:实现ObjectDeserializer接口

    ObjectDeserializer接口为可以实现自定义反序列化实现接口,配合ParserConfig的全局设置,也可以达到预期的效果,合建StringTrimDeserializer类,对String进行处理:

    /**
     * @title: StringTrimDeserializer
     * @description: 把String类型的内容统一做trim操作
     */
    public class StringTrimDeserializer implements ObjectDeserializer {
    
    	@Override
    	public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
    		// JSON String反序列化的逻辑比较复杂,在StringCodec的基础上,对其结果调用trim方法
    		Object obj = StringCodec.instance.deserialze(parser, type, fieldName);
    		if (obj instanceof String) {
    			String str = (String) obj;
    			return (T) str.trim();
    		}
    		return (T) obj;
    	}
    
    	@Override
    	public int getFastMatchToken() {
    		return JSONToken.LITERAL_STRING;
    	}
    }
    

    相应在,在HttpMessageConverters类fastJsonHttpMessageConverters方法内中增加String类的反序列化设置:

    // 设置String类的全局反序列化规则:自动完成trim操作
    ParserConfig.getGlobalInstance().putDeserializer(String.class, new StringTrimDeserializer());
    

    tips:
    在StringTrimDeserializer类实现方法中为什么不直接parser.getLexer().stringVal()得到值后执行trim方法,而是调用StringCodec.instance的实现方法?

    StringCodec是fastJson默认的String类型的反序列化逻辑类,里面要处理的类型有String、StringBuffer、StringBuilder等,还有各种的集合、数组结构,涉及的nextToken值都不相同,总之,对String文本的反序列化,实现逻辑和应对的场景都比较复杂,而此次的需求只是对String执行trim操作,复杂的逻辑还是交给StringCodec来处理,站在StringCodec的基础上,对其结果执行trim方法就可以达到预期目标。

    小结

    今天这篇是记录Json自定义序列化和反序列化的实践方案,开始实施前先确认工程里使用的框架是哪个,否则就会出现添加了@JsonSerialize注解,搞了大半天没有效果,回头一看框架是fastjson,没有触发入口,当然得不到预期效果,小小建议,希望对你有帮助。

    展开全文
  • 对于使用结构体中嵌套结构体的情况,只有receiver为指针类型,而嵌套结构体为结构体的值语义的时候不能触发自定义Json格式函数MarshalJSON;其他三种组合均能够触发。对于使用结构体中嵌套结构体slice的情况,...
  • 夏普枚举 枚举有问题。 该库提供了基类SharpEnum用于创建枚举的强类型替代项。 电流限制 请记住,此库目前有一些限制: 枚举值必须为int ,字符保留为分隔符 快速开始 SharpEnums是通过从SharpEnum抽象类继承而定义...
  • Newtonsoft.Json 自定义序列化特性

    千次阅读 2016-04-04 22:21:45
    目前在项目中经常使用Newtonsoft.Json,因项目需要对其中的特定数据类型序列化有特殊要求,特地学习了下如何对Newtonsoft.Json序列化进行自定义扩展开发。 1、对DateTime类型,序列化输出为时间戳; 2、对string...
  • 开发过程中,我们经常会使用 JSON 作为数据传输格式。...我们可以使用 encoding/json 包的 Encoder.Encode() 和 Marshal() 实现 Json 序列化,使用 Decoder.Decode() 和 Unmarshal() 实现 Json 反...
  • 这里只讲JSON-LIB和FastJson两种Json工具的序列化过滤问题  比如,我想过滤的属性有id,和name,先演示json-lib  1.Json-Lib  //通过json-lib将数据序列化为json格式  JsonConfig jsonConfig = new ...
  • 我们知道,通过tag,可以有条件地实现定制Go JSON序列化的方式,比如json:"abc,omitempty", 当字段的值为空的时候,我们可以在序列化后的数据中不包含这个值,而json:"-"可以直接不被JSON序列化,如果想被序列化key-,...
  • HttpClient.ReadAsStringAsync自定义序列化 public class SysShopInfoDto { /// <summary> /// 部门Id /// </summary> public string id { get; set; } /// <summary> ...
  • 在@JsonView的帮助下,我们可以决定要序列化的模型类的字段满足最小标准(我们必须定义标准),就像我们可以有一个具有10个属性的核心类,但只有5个属性可以序列化,这对于客户端是必需的 只要只需创建以下类来定义...
  • 参考: Jackson注册SimpleModule自定义序列...springboot实现自定义序列化一个例子 https://stackoverflow.com/questions/45713934/jackson-deserialize-geojson-point-in-spring-boot springboot默认使用Jacks.
  • public static class JsonHelper { static JsonHelper() { Newtonsoft.Json.JsonSerializerSettings setting = new Newtonsoft.Json.JsonSerializerSettings(); ...
  • 下面这篇文章主要介绍了关于golang自定义json序列化应用的相关内容,下面话不多说了,来一起看看详细的介绍吧 问题引入 当某个struct存在某个字段为string或者[]byte类型但是实际上保存的内容是json格式的数据时,...
  • 前言 在上一章节中,壹哥给大家介绍了在...而JSON信息本身也比较复杂,其中有些细节需要我们注意,比如JSON序列化和反序列化。 一. 序列化与反序列化简介 1. 概述 HttpMessageConverter在转换http请求和响应.
  • fastjson自定义序列化、反序列化
  • json模块提供了一个类似于pickle中用于转换内存中Python对象为一个序列表示形式(“JavaScript Object Notation”)的API接口. 但和pickle不同的是, JSON在其他很多语言中都有对应实现(特别是在JavaScript中), 使其...
  • 在C#中序列化和反序列化自定义的类对象是比较容易的,比如像下面的一个Customer类, private class Customer { public string CustomerName { get; set; } public string Email { get; set; } public int Age { ...
  • C# Newtonsoft.Json 自定义

    千次阅读 2018-11-05 12:31:32
    C# Newtonsoft.Json 自定义 当你看到这篇文章时,你应该或多或少地...本文将首先简介 Newtonsoft.Json 的基本使用,然后介绍如何实现序列化自定义,即自定义 JsonConverter。 基础使用 先定义一个普通的类型,然...
  • 而我们最常用的序列化工具应该就是Newtonsoft.Json,当然你用其它工具类也是没问题的,我们重点讲的不是这个工具,我们的重点是高效的可自定义控制的序列化操作. 首先我们说一下大致的序列化原理: 一般情况下,我们把一...
  •     做项目的时候,我给前端提供了一个查询列表的接口,但是随着数据的...该注解可以自定义序列化,可以写在某一个属性上,也可以写在整个类上(也可以用在getter()方法上与前者相似)。  &n
  • 本篇文章主要介绍了java如何利用FastJSON、Gson、Jackson三种Json格式工具自定义时间序列化,具有一定的参考价值,有兴趣的可以了解一下
  • c++json对象序列化序列化代码生成工具。提供对象定义工具,定义项目、对象、字段。然后通过代码生成工具,生成json序列化、反序列化代码。c++json对象序列化序列化代码生成工具。提供对象定义工具,定义项目、...
  • json.net可以说是.net平台最好的json序列化类库了。 在使用的过程中,我遇到了这个问题,比如说List中,如果是T的子类U,依然会被反序列化成T的,所以我需要自己定义序列化方法,在json.net中,只要继承...
  • 来源:https://www.c-sharpcorner.com/UploadFile/20c06b/deserializing-interface-properties-with-json-net/
  • 1. 序列化器 package com.springboot.kafkademo.serialization; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import org.apache.kafka.common.serialization.Serializer; import ...
  • RedisTemplate自定义序列化,将Key设置为String 在config包中新建RedisConfig类 添加代码 @Configuration public class RedisConfig { @Bean("strKeyRedisTemplate") public RedisTemplate<Object, Object>...
  • jdk自带的序列化方式,我们无法直接看到数据,可以使用使用自定义序列化方式,来实现Redis存储json格式数据 @Configuration public class RedisConfig{ @Bean public RedisCacheManager cacheManager...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 72,773
精华内容 29,109
关键字:

json自定义序列化