我有一個復合物件,如下所示:
Map<String, Object> m = new HashMap<>();
m.put("a", "b");
m.put("c", "{\"a\" :3, \"b\" : 5}");
m = {a=b, c={"a" :3, "b" : 5}}
我必須通過 https 呼叫提交此請求才能反序列化為 java 物件,因此我將其轉換為 JSON 字串,使用,
objectmapper.writeValueAsString(m)
當我轉換它時,它會將引號附加到 c 的值:
{"a":"b","c":"{\"a\" :3, \"b\" : 5}"}
并且在客戶端反序列化此物件時,請求失敗并顯示“錯誤將 JSON 值反序列化為型別:類”
有什么幫助嗎??
uj5u.com熱心網友回復:
該值的型別C是字串,因此物件映射器會轉義所有非法字符并將字串用引號括起來。
您可以制作C另一張地圖:
Map<String, Object> c = new HashMap<>();
c.put("a", 3);
c.put("b", 5);
Map<String, Object> m = new HashMap<>();
m.put("a", "b");
m.put("c", c);
或者您可以創建自定義 POJO 并使用@JsonRawValue注釋:
public class MyPojo{
private String a;
@JsonRawValue
private String c;
// getter and setters
}
MyPojo m = new MyPojo();
m.setA("b");
m.setB("{\"a\" :3, \"b\" : 5}");
objectmapper.writeValueAsString(m);
從檔案中:
標記注釋,指示注釋的方法或欄位應按原樣包含屬性的字面字串值來序列化,而不用參考字符。這對于注入已經在 J??SON 中序列化的值或將 javascript 函式定義從服務器傳遞到 javascript 客戶端非常有用。 警告:根據您的輸入值,生成的 JSON 流可能無效。
客戶端錯誤的含義可能是它無法將 String 反序列化為 Object (它期望{而不是")。
uj5u.com熱心網友回復:
您最好使用價值JSONObject:c
JSONObject json = new JSONObject();
json.put("a", 3);
json.put("b", 5);
Map<String, Object> m = new HashMap<>();
m.put("a", "b");
m.put("c", json);
完整代碼:
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import net.minidev.json.JSONObject;
import java.util.HashMap;
import java.util.Map;
public static void main(String[] args) throws JsonProcessingException {
JSONObject json = new JSONObject();
json.put("a", 3);
json.put("b", 5);
Map<String, Object> m = new HashMap<>();
m.put("a", "b");
m.put("c", json);
ObjectMapper objectMapper = new ObjectMapper();
String valueAsString = objectMapper.writeValueAsString(m);
System.out.println(valueAsString);
}
輸出是:
{"a":"b","c":{"a":3,"b":5}}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/477181.html
