GVKun编程网logo

json返回值过滤null值(json返回值类型)

13

以上就是给各位分享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返回值类型)

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对象

android – 使用gson解析Json返回null对象

我正在通过gson解析一个Json字符串,这是Json字符串

[
{
    "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的实体类.

解决方法

MyBranch类中字段的名称与json中的字段不匹配,因此您必须使用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)
    @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

asp.net-mvc – MVC4 Action返回没有null的JsonResult

我有一个动作,它返回一个特定类的对象的JsonResult.我已经使用一些attrib来装饰这个类的属性以避免使用null字段.类定义是:
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}]

我错过了什么或做错了什么?

解决方法

正如Brad Christie所说,MVC4仍然使用JavaScriptSerializer,因此为了让你的对象被Json.Net序列化,你将不得不执行几个步骤.

首先,从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值

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返回[]

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返回[]等相关知识,可以在本站进行查询。

本文标签: