以上就是给各位分享json返回值过滤null值,其中也会对json返回值类型进行解释,同时本文还将给你拓展android–使用gson解析Json返回null对象、asp.net-mvc–MVC4Ac
以上就是给各位分享json返回值过滤null值,其中也会对json返回值类型进行解释,同时本文还将给你拓展android – 使用gson解析Json返回null对象、asp.net-mvc – MVC4 Action返回没有null的JsonResult、c# – Json.NET JsonConvert.DeserializeObject()返回null值、fastjson 处理null值,对象为null时返回{},数字为null返回[]等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:- json返回值过滤null值(json返回值类型)
- android – 使用gson解析Json返回null对象
- asp.net-mvc – MVC4 Action返回没有null的JsonResult
- c# – Json.NET JsonConvert.DeserializeObject()返回null值
- fastjson 处理null值,对象为null时返回{},数字为null返回[]
json返回值过滤null值(json返回值类型)
1.全局配置
@Configuration
public class JackSonConfig {
@Bean
@Primary
@ConditionalOnMissingBean(ObjectMapper.class)
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
return objectMapper;
}
}
或者
<mvc:annotation-driven>
<!-- 强化参数接收 -->
<mvc:argument-resolvers> <bean class="org.durcframework.common.form.FormModelMethodArgumentResolver" /> </mvc:argument-resolvers> <mvc:message-converters> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper"> <bean class="com.fasterxml.jackson.databind.ObjectMapper"> <!-- 处理responseBody 里面日期类型 --> <property name="dateFormat"> <bean class="java.text.SimpleDateFormat"> <constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss" /> </bean> </property> <!-- 为null字段时不显示 --> <property name="serializationInclusion"> <value type="com.fasterxml.jackson.annotation.JsonInclude.Include">NON_NULL</value> </property> </bean> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>
2.部分配置
@JsonInclude(Include.NON_NULL)
public class XXXX{
}
android – 使用gson解析Json返回null对象
[ { "ID": 1,"Name": "Australia","Active": true },{ "ID": 3,"Name": "Kiev",{ "ID": 4,"Name": "South Africa",{ "ID": 5,"Name": "Stockholm",{ "ID": 6,"Name": "Paris",{ "ID": 7,"Name": "Moscow",{ "ID": 8,"Name": "New York City",{ "ID": 9,"Name": "Germany",{ "ID": 10,"Name": "copenhagen",{ "ID": 11,"Name": "Amsterdam","Active": true } ]
这是将被使用的对象
public class MyBranch extends Entity { public MyBranch () { super(); } public MyBranch (int id,String name,String isActive) { super(); _ID = id; _Name = name; _Active = isActive; } @Column(name = "id",primaryKey = true) public int _ID; public String _Name; public String _Active; } Gson gson = new Gson(); Type t = new Typetoken<List<MyBranch >>() {}.getType(); List<MyBranch > list = (List<MyBranch >) gson.fromJson(json,t);
构造的列表,它有10个对象,但问题是对象的所有数据成员都是null,我不会对此有什么不妥.实体是OrmDroid的实体类.
解决方法
import com.google.gson.annotations.Serializedname; public class MyBranch extends Entity { public MyBranch () { super(); } public MyBranch (int id,String isActive) { super(); _ID = id; _Name = name; _Active = isActive; } @Column(name = "id",primaryKey = true) @Serializedname("ID") public int _ID; @Serializedname("Name") public String _Name; @Serializedname("Active") public String _Active; }
编辑:
您还可以通过简单重命名MyBranch字段来避免使用Serializedname注释:
import com.google.gson.annotations.Serializedname; public class MyBranch extends Entity { public MyBranch () { super(); } public MyBranch (int id,String isActive) { super(); ID = id; Name = name; Active = isActive; } @Column(name = "id",primaryKey = true) public int ID; public String Name; public String Active; }
asp.net-mvc – MVC4 Action返回没有null的JsonResult
private class GanttEvent { public String name { get; set; } [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] public String desc { get; set; } [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] public List<GanttValue> values { get; set; } }
在我的动作中我使用了一个对象
var res = new List<GanttEvent>();
我回来使用:
return Json(res,JsonRequestBehavior.AllowGet);
不幸的是,我仍然在输出时收到空值:
[{"name":"1.1 PREVIOS AL INICIO ","desc":null,"values":null},{"name":"F04-PGA-S10","desc":"Acta preconstrucción",{"name":"F37-PGA-S10","desc":"Plan de inversión del anticipo",{"name":"F09-PGA-S10","desc":"Acta de vecindad",{"name":"F05-PGA-S10","desc":"Acta de inicio",{"name":"F01-PGA-S10","desc":"Desembolso de anticipo","values":null}]
我错过了什么或做错了什么?
解决方法
首先,从JsonResult继承一个新类JsonNetResult,如下所示(基于this solution):
public class JsonNetResult : JsonResult { public JsonNetResult() { this.ContentType = "application/json"; } public JsonNetResult(object data,string contentType,Encoding contentEncoding,JsonRequestBehavior jsonRequestBehavior) { this.ContentEncoding = contentEncoding; this.ContentType = !string.IsNullOrWhiteSpace(contentType) ? contentType : "application/json"; this.Data = data; this.JsonRequestBehavior = jsonRequestBehavior; } public override void ExecuteResult(ControllerContext context) { if (context == null) throw new ArgumentNullException("context"); var response = context.HttpContext.Response; response.ContentType = !String.IsNullOrEmpty(ContentType) ? ContentType : "application/json"; if (ContentEncoding != null) response.ContentEncoding = ContentEncoding; if (Data == null) return; // If you need special handling,you can call another form of SerializeObject below var serializedobject = JsonConvert.SerializeObject(Data,Formatting.None); response.Write(serializedobject); } }
然后,在您的控制器中,重写Json方法以使用新类:
protected override JsonResult Json(object data,JsonRequestBehavior behavior) { return new JsonNetResult(data,contentType,contentEncoding,behavior); }
c# – Json.NET JsonConvert.DeserializeObject()返回null值
string _jsonObject = {\"Ad\":{\"Type\":\"Request"\,\"IdAd\":\"xxx@xxx.com\",\"Category\":\"cat\",\"SubCategory\":\"subcat\"},\"Position\":{\"Latitude\":\"38.255\",\"Longitude\":\"1.2\",\"Imei\":\"0123456789\"}; }"; Message _message = JsonConvert.DeserializeObject<Message>(_jsonObject);
适用于“广告”而非实际的“位置”.
任何的想法 ?
解决方法
在我的例子中,我有一个带有其他对象数组的对象,并且在反序列化后,这些子对象上的一个引用类型属性始终为null.我尝试了各种各样的东西,包括下载JSON.Net源代码并逐步完成它以找到失败点.
长话短说,问题当然是我自己的问题.这是我的JSON和类的高度简化版本.
JSON
{ "$id": "1","RowCount": 10,"Rows": [{ "$id": 2","ItemId": "1","ItemName": "Some Item","Owner": { "Name": "John Doe","Id": "711D04F5-586F-4FD4-8369-4C00B51DD86F",// other properties... },"OwnerId": "711D04F5-586F-4FD4-8369-4C00B51DD86F" },// more rows ] }
类
public class Items { public int RowCount { get; set; } public IEnumerable<Item> Rows { get; set; } } public class Item { private string ownerId; public string ItemId { get; set; } public string ItemName { get; set; } public Person Owner { get; set; } public string OwnerId { get { return this.ownerId; } set { if (value != this.ownerId) { this.Owner = null; } this.ownerId = value; } } } public class Person { public string Name { get; set; } public string Id { get; set; } // other properties }
发生的事情是,因为Owner属性出现在OwnerId属性之前的JSON中,所以当设置了OwnerId属性时,setter代码确定当前值与设置的值不同(因为当前值是null),因此它将Owner属性设置为null.
为了解决这个问题,我还检查了针对Owner对象的id设置的值,如果它们相同,则跳过将Owner设置为null.
不可否认,我的问题的原因可能并不是每个人都一样,但这至少是一个警示故事,要仔细检查在反序列化过程中初始化对象时发生的情况.
fastjson 处理null值,对象为null时返回{},数字为null返回[]
针对这一情况。
我用的json转换工具是fastjson,网上查知fastjson 有ValueFilter接口可以实现自定义过滤
packagecom.alibaba.fastjson.serializer; publicinterfaceValueFilterextendsSerializefilter{ Objectprocess(Objectobject,Stringname,Objectvalue); }
知道接口后就简单了。
process(Objectobject,Objectvalue)//三个参数,object为要转成json的对象,name是对象的get/is方法的名字(去掉get或is前缀并首字母小写),value就是对应的get值 //思路就是通过object和name反射方法得出其return的类型。针对value==null的基础数据类型的或者list的类型的做出不同处理 //实现的部分代码(PS:时间类型我也算到基础类型了。) privatestaticString[]types={"java.lang.Integer","java.lang.Double","java.lang.Float","java.lang.Long","java.lang.Short","java.lang.Byte","java.lang.Boolean","java.lang.Char","java.lang.String","java.util.Date","int","double","long","short","byte","boolean","char","float"}; privatestaticStringfirst2Up(Stringstr){ returnstr.substring(0,1).toupperCase()+str.substring(1); } privatestaticValueFilternullValueFilter=newValueFilter(){ @Override publicObjectprocess(Objectobject,Objectvalue){ if(value==null){ try{ Methodmethod=object.getClass().getDeclaredMethod("get"+first2Up(name)); for(Stringtype:types){ if(method.getReturnType().getName().equals(type)){ return""; } } if(method.getReturnType().isAssignableFrom(List.class)&& !method.getReturnType().getName().equals("java.lang.Object")){ returnnewint[0]; } returnnewObject(); }catch(SecurityException|NoSuchMethodExceptione){ e.printstacktrace(); returnvalue; } } returnvalue; } }; privatestaticStringdateFormat="yyyy-MM-ddHH:mm:ss"; privatestaticSerializeConfigmapping=newSerializeConfig(); static{ mapping.put(Date.class,newSimpleDateFormatSerializer(dateFormat)); } //只是部分代码,有些数字类型,也需要加上引号过滤的对象是notNullValueFilter,原理一样,就不贴出来了,mapping是对日期的格式化方法 publicstaticStringtoJsonString(Objectobj){ Serializefilter[]filters={nullValueFilter,notNullValueFilter}; returnjsON.toJSONString(obj,mapping,filters); }
附上原先的json接口转换方法,希望能抛砖引玉
publicStringobject2Json(Objectobject)throwsIOException{ if(!objectUtil.isNotEmpty(object)){ return""; } ObjectMappermapper=JacksonMapper.getInstance(); //字段和值都加引号 mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES,true); //数字加引号 mapper.configure(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS,true); mapper.configure(JsonGenerator.Feature.QUOTE_NON_NUMERIC_NUMBERS,true); mapper.getSerializerProvider().setNullValueSerializer(newJsonSerializer<Object>() { publicvoidserialize( Objectvalue,JsonGeneratorjg,SerializerProvidersp)throwsIOException,JsonProcessingException { jg.writeString(""); } }); returnmapper.writeValueAsstring(object); }
今天关于json返回值过滤null值和json返回值类型的分享就到这里,希望大家有所收获,若想了解更多关于android – 使用gson解析Json返回null对象、asp.net-mvc – MVC4 Action返回没有null的JsonResult、c# – Json.NET JsonConvert.DeserializeObject()返回null值、fastjson 处理null值,对象为null时返回{},数字为null返回[]等相关知识,可以在本站进行查询。
本文标签: