關(guān)于遠(yuǎn)程調(diào)用返回linkedhashMap原因:
因?yàn)閞pc遠(yuǎn)程調(diào)用在底層還是使用的HTTPClient罢浇,所以在傳遞參數(shù)的時(shí)候关翎,必定要有個(gè)順序扛门,當(dāng)你傳遞map的時(shí)候map里面的值也要有順序,不然服務(wù)層在接的時(shí)候就出問題了纵寝,所以它才會(huì)轉(zhuǎn)為linkedhashMap论寨。
spring 有一個(gè)類叫ModelMap,繼承了linkedhashMap public
class ModelMap extends
LinkedHashMap,所以一個(gè)接口返回的結(jié)果就可以直接用ModelMap來接爽茴,注意ModelMap是沒有泛型的葬凳,不管你返回的結(jié)果是什么類型的map令哟,泛型是多復(fù)雜的map签孔,都可以直接new一個(gè)Modelmap蛾坯,用它來接返回的結(jié)果衰齐。
ObjectMapper mapper =new ObjectMapper();
List recommendGroupList = mapper.convertValue(resultMap.get("records"),
? ? ? ? new TypeReference>(){});
以上處理方法需要將接收的對(duì)象用:@JsonIgnoreProperties(ignoreUnknown =true) 否則當(dāng)別的服務(wù)新增字段時(shí)候,本服務(wù)沒同步增加會(huì)報(bào)錯(cuò).。
微服務(wù)中從其他服務(wù)獲取過來的對(duì)象啊终,如果從Object強(qiáng)轉(zhuǎn)為自定義的類型會(huì)報(bào)錯(cuò)部默,利用ObjectMapper轉(zhuǎn)換帽蝶。
ObjectMapper mapper =new ObjectMapper();
DefaultResponse defaultResponse = proxy.getData();
Listresources = () defaultResponse.getData();? //這里的場(chǎng)景是:data是一個(gè)Object類型的绒怨,但是它其實(shí)是一個(gè)List江场,想把List中的每個(gè)對(duì)象分別轉(zhuǎn)成可用的對(duì)象for(inti = 0; i < serviceDateResources.size(); i++) {
? ? Resource resource = mapper.convertValue(resources.get(i), Resource.class);? //經(jīng)過這步處理,resource就是可用的類型了窖逗,如果不轉(zhuǎn)化會(huì)報(bào)錯(cuò)
}
上面轉(zhuǎn)換的過程中,如果返回的字段你不是都需要餐蔬,需要忽略其中的幾個(gè)字段碎紊,在自定義的類中添加如下:
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
@JsonIgnoreProperties(ignoreUnknown =true)
public class Resource {//? private Integer orderId; //提供有這個(gè)參數(shù),但是不想獲取? private Integer otrerFiled;
}
或者下面方法:這兩種方法不用添加注解
一:ObjectMapper mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD,Visibility.ANY);
? mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
二:ObjectMapperobjectMapper=newObjectMapper();mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
ObjectMapper可以實(shí)現(xiàn)對(duì)象到j(luò)son等其他格式的互轉(zhuǎn)樊诺。如果向?qū)ava對(duì)象轉(zhuǎn)成Json格式仗考,可以用:
ObjectMapper mapper =new ObjectMapper();
mapper.writeValueAsString(object);
會(huì)有JsonProcessingException異常,需要自己處理词爬。在轉(zhuǎn)換的過程中秃嗜,有可能有的屬性被設(shè)成空就不序列化等的需求,可以在類的屬性上或直接在類上加上一下注解顿膨。用在屬性上就是只針對(duì)一個(gè)屬性锅锨,用在類上就是針對(duì)類里的所有屬性。
@JsonInclude(Include.NON_NULL)
@JsonInclude(Include.Include.ALWAYS) 默認(rèn)
@JsonInclude(Include.NON_DEFAULT) 屬性為默認(rèn)值不序列化
@JsonInclude(Include.NON_EMPTY) 屬性為 空(“”) 或者為 NULL 都不序列化
@JsonInclude(Include.NON_NULL) 屬性為NULL 不序列化
因?yàn)樾【幨菆D片上傳恋沃,應(yīng)用如下:
? ? R uploadFile = uploadFeignService.Upload(file, userId);//獲取遠(yuǎn)程對(duì)象
? ? ObjectMapper mapper = new ObjectMapper();//進(jìn)行轉(zhuǎn)換
? ? String jsonStr =mapper.writeValueAsString(uploadFile.get("filePath"));//將linkedhashMap轉(zhuǎn)為json
? ? JSONObject jsondata= JSON.parseObject(jsonStr);//json對(duì)象
? ? String path = jsondata.getString("path");