如何在 Java 中反序列化此 json?
How to deserialize this json in Java?
[
"news",
"{\"marketType\":\"chako\",\"data\":\"[{\\"price\\":572.05,\\"qty\\":106},{\\"price\\":224.08,\\"qty\\":700.25},{\\"price\\":440.5,\\"qty\\":600.55}]\"}"
]
我通过 websocket 在 chrome 中获取这些数据。这实际上以 42 开头,但为简单起见,我已将其删除,因为它可以通过 String.split("42",2)
删除。尝试了自定义反序列化器和其他东西,但没有成功。
看起来是一个数组,其中第二个元素是包含JSON的字符串,它有2个字段,marketType
和data
。 data
又是一个包含 JSON.
的字符串
已编辑:Java 解决方案
void test() throws IOException {
String json = "["
+ "\"news\","
+ " \"{\\"marketType\\":\\"chako\\",\\"data\\":\\"[{\\\\"price\\\\":572.05,\\\\"qty\\\\":106},{\\\\"price\\\\":224.08,\\\\"qty\\\\":700.25},{\\\\"price\\\\":440.5,\\\\"qty\\\\":600.55}]\\"}\""
+ "]";
ObjectMapper mapper = new ObjectMapper();
List<String> arr = mapper.readValue(json, new TypeReference<List<String>>() {});
Map<String, String> obj = mapper.readValue(arr.get(1), new TypeReference<Map<String, String>>() {});
List<Map<String, Number>> data = mapper.readValue(obj.get("data"), new TypeReference<List<Map<String, Number>>>() {});
System.out.println(data);
}
编辑前:
Java用于 chrome.
的脚本解决方案
const arr = [
"news",
"{\"marketType\":\"chako\",\"data\":\"[{\\"price\\":572.05,\\"dairy\\":106},{\\"price\\":224.08,\\"dairy\\":700.25},{\\"price\\":440.5,\\"dairy\\":600.55}]\"}"
];
const record = JSON.parse(arr[1]);
const data = JSON.parse(record["data"])
console.log(data) // This is an array or objects with "price" and "dairy" properties
所以这是一个有点混乱的字符串化数据。要取消字符串化或解析此数据,您需要对对象和每个对象使用 JSON.parse 属性。你需要先隔离数组的第二部分。然后解析对象中的数据对象。本质上,您具有双字符串化的子属性。如果您可以控制另一端,我可能会建议您修复导致您对对象属性进行字符串化的错误。
let array = [
"news",
"{\"marketType\":\"chako\",\"data\":\"[{\\"price\\":572.05,\\"qty\\":106},{\\"price\\":224.08,\\"qty\\":700.25},{\\"price\\":440.5,\\"qty\\":600.55}]\"}"
];
let object = JSON.parse(array[1]);
object.data = JSON.parse(data);
如果出于某种原因您有多个像这样的字符串化子属性,您可能需要使用 object.keys 并创建一个递归循环。
试试这个:
ObjectMapper mapper = new ObjectMapper();
Map<String,Object> map = mapper.readValue(json, Map.class);
[
"news",
"{\"marketType\":\"chako\",\"data\":\"[{\\"price\\":572.05,\\"qty\\":106},{\\"price\\":224.08,\\"qty\\":700.25},{\\"price\\":440.5,\\"qty\\":600.55}]\"}"
]
我通过 websocket 在 chrome 中获取这些数据。这实际上以 42 开头,但为简单起见,我已将其删除,因为它可以通过 String.split("42",2)
删除。尝试了自定义反序列化器和其他东西,但没有成功。
看起来是一个数组,其中第二个元素是包含JSON的字符串,它有2个字段,marketType
和data
。 data
又是一个包含 JSON.
已编辑:Java 解决方案
void test() throws IOException {
String json = "["
+ "\"news\","
+ " \"{\\"marketType\\":\\"chako\\",\\"data\\":\\"[{\\\\"price\\\\":572.05,\\\\"qty\\\\":106},{\\\\"price\\\\":224.08,\\\\"qty\\\\":700.25},{\\\\"price\\\\":440.5,\\\\"qty\\\\":600.55}]\\"}\""
+ "]";
ObjectMapper mapper = new ObjectMapper();
List<String> arr = mapper.readValue(json, new TypeReference<List<String>>() {});
Map<String, String> obj = mapper.readValue(arr.get(1), new TypeReference<Map<String, String>>() {});
List<Map<String, Number>> data = mapper.readValue(obj.get("data"), new TypeReference<List<Map<String, Number>>>() {});
System.out.println(data);
}
编辑前:
Java用于 chrome.
的脚本解决方案const arr = [
"news",
"{\"marketType\":\"chako\",\"data\":\"[{\\"price\\":572.05,\\"dairy\\":106},{\\"price\\":224.08,\\"dairy\\":700.25},{\\"price\\":440.5,\\"dairy\\":600.55}]\"}"
];
const record = JSON.parse(arr[1]);
const data = JSON.parse(record["data"])
console.log(data) // This is an array or objects with "price" and "dairy" properties
所以这是一个有点混乱的字符串化数据。要取消字符串化或解析此数据,您需要对对象和每个对象使用 JSON.parse 属性。你需要先隔离数组的第二部分。然后解析对象中的数据对象。本质上,您具有双字符串化的子属性。如果您可以控制另一端,我可能会建议您修复导致您对对象属性进行字符串化的错误。
let array = [
"news",
"{\"marketType\":\"chako\",\"data\":\"[{\\"price\\":572.05,\\"qty\\":106},{\\"price\\":224.08,\\"qty\\":700.25},{\\"price\\":440.5,\\"qty\\":600.55}]\"}"
];
let object = JSON.parse(array[1]);
object.data = JSON.parse(data);
如果出于某种原因您有多个像这样的字符串化子属性,您可能需要使用 object.keys 并创建一个递归循环。
试试这个:
ObjectMapper mapper = new ObjectMapper();
Map<String,Object> map = mapper.readValue(json, Map.class);