Im使用net.sf.json.JSONArray和net . SF . JSON . JSONObject . JSON array包含多个JSON object。
基本上是这样的:
[
{
"obj1": [
{
"ID": 12
"NAME":"Whatever",
"XY":[1,2]
},
{
"ID": 34
"NAME":"Again",
"XY":[23,43]
},
etc
]
},
{ "obj2": repeat}
]
我想用Java 8来解决这个问题,即结果:
[
{
"obj1": [
[12,'Whatever',1,2],
[34,'Again',23,43],
etc...
]
},
{ "obj2": repeat}
]
JSONArray array = ...;
JSONArray flattedArray = flatten(array);
JSONObject map = ...;
JSONObject flattedMap = flatten(map);
当json结构发生变化时,实现发生了巨大的变化,您可以在github上比较我的提交历史。测试可以告诉你我是如何实现你的功能的。
public JSONArray flatten(Collection<?> array) {
return array.stream().flatMap(this::flatting).collect(toJSONArray());
}
private Stream<?> flatting(Object it) {
if (it instanceof Collection) {
return ((Collection<?>) it).stream();
}
if (it instanceof Map) {
return Stream.of(flatten((Map<?, ?>) it));
}
return Stream.of(it);
}
public JSONObject flatten(Map<?, ?> map) {
return map.entrySet().stream().collect(
JSONObject::new,
(it, field) -> it.put(field.getKey(), flatten(field.getValue())),
JSONObject::putAll
);
}
private Object flatten(Object it) {
if (it instanceof Collection) {
return ((Collection<?>) it).stream().map(this::flatten)
.collect(toJSONArray());
}
if (it instanceof Map) {
return flatten(((Map<?, ?>) it).values());
}
return it;
}
private <T> Collector<T, ?, JSONArray> toJSONArray() {
return toCollection(JSONArray::new);
}
尽管您可以使用/out递归以命令式方式轻松完成此操作,但以函数式风格实现可能更容易。我不确定我是否擅长Java8中的惯用函数代码,但您需要:
static Collector<Object, JSONArray, JSONArray> toJSONArray() {
return Collector.of(
JSONArray::new, // Create a new array
JSONArray::add, // Add each element to the target array
(a1, a2) -> { // Merge the second array into the first one
a1.addAll(a2);
return a1;
},
identity() // Return the populated array itself
);
}
Q43481457
只是当前的类名)。static Stream<?> flatten(final Object value) {
return value instanceof Collection
? ((Collection<?>) value).stream().flatMap(Q43481457::flatten) // Flatten recursively
: Stream.of(value); // Otherwise wrap a single element into a stream
}
@SupressWarnings("unchecked")
final Collection<JSON> jsonArray = (Collection<JSON>) originalJsonArray;
final JSONArray flatJSONArray = jsonArray.stream()
.map(json -> (Map<?, ?>) json) // All outer array elements are JSON objects and maps in particular
.map(jsonObject -> jsonObject.values() // Recursively flatten the JSON object values
.stream()
.flatMap(Q43481457::flatten)
.collect(toJSONArray()) // ... collecting them to JSON arrays
)
.collect(toJSONArray()); // ... which are collected to JSON arrays
System.out.println(flatJSONArray);
输出:
[[12,“无论如何”,1,2],[34,“再次”,23,43]]
本文向大家介绍JSONObject与JSONArray的使用,包括了JSONObject与JSONArray的使用的使用技巧和注意事项,需要的朋友参考一下 1.JAR包简介 要使程序可以运行必须引入JSON-lib包,JSON-lib包同时依赖于以下的JAR包: 1.commons-lang.jar 2.commons-beanutils.jar 3.commons-collections.jar
本文向大家介绍浅析Java中JSONObject和JSONArray使用,包括了浅析Java中JSONObject和JSONArray使用的使用技巧和注意事项,需要的朋友参考一下 废话不多说,先给大家贴代码,具体代码如下所示: 运行结果如下: 通过构造器的方式创建的JSONObject对象:{"derek":"23","dad":"49","mom":"45"} 通过fromObject方法将ma
问题内容: 我今天在这个主题上搜索了很多。但是我找不到它,如何将JSONArray添加到JSONObject? 因为每次执行此操作都会收到此错误:Stackoverflow 我收到此错误: 我想要的JSON:只有最后一个JsonArray出问题了: ,“ vloer”:[{formaat:’vierkant10x15’tegels:[{naam:’‘,imgThumb:’/bla/bla.png’
本文向大家介绍Java中JSONObject与JSONArray的使用区别详解,包括了Java中JSONObject与JSONArray的使用区别详解的使用技巧和注意事项,需要的朋友参考一下 最近公司开发的几个项目中,后台Action向前端传递数据都是Json格式,于是对JSONObject、JSONArray简单的研究了一下,废话不多说,想使用JSONObject、JSONArray,策则在项目
问题内容: 基本上我有: 现在,我想将其转换为包含相同信息的。这样我就可以绕过对象,然后在需要时可以从对象中获取所有信息。任何帮助,将不胜感激,谢谢。 问题答案: 通常,Json对象将包含您的值(包括数组)作为其中的命名字段。因此,类似: 在JSON中将是{“ arrayName”:[…]}。
我需要这样的输出JSON: 每个部分中的值将通过循环获得。我该如何形成这种JSON呢? 我有第一点: 但我不确定我需要做什么才能得到球员名单。 我正在使用Java-JSON库。