gpt4 book ai didi

java - 将 JSON 转换为排序 JSON,其中包含嵌套节点中的 JSONArray

转载 作者:行者123 更新时间:2023-11-30 01:43:25 29 4
gpt4 key购买 nike

这里我想知道,如何将未排序的 JSON 字符串转换为包含多个 JSON 的已排序 JSON 字符串数组作为子元素。下面给出了未排序的 JSON 字符串示例,

{
"name": "John",
"age": 22,
"foods": [{
"product": "apple",
"price": 100
}, {
"fruit": "banana",
"price": 100
}
],

"attributes": {
"OBJECTID": "35",
"FACILITYTYPE": "Pharmacy",
"FACILITYSUBTYPE": "24 Hr Pharmacy",
"COMMERCIALNAME_E": "SADD MAARAB PHARMACY"
}
}

预期输出如下,

{
"age": 22,
"attributes": {
"COMMERCIALNAME_E": "SADD MAARAB PHARMACY",
"FACILITYSUBTYPE": "24 Hr Pharmacy",
"FACILITYTYPE": "Pharmacy",
"OBJECTID": "35"
},
"foods": [{
"price": 100m
"product": "apple"
}, {
"fruit": "banana",
"price": 100
}
],
"name": "John",
}

有人可以帮助我实现这个要求吗?

最佳答案

JSON ObjectJava可以表示为Map<String, Object>JSON Array可以表示为List , Set , array[]或任何其他 Collection 。最流行的库如JacksonGson默认情况下可以这样做。对于 JSON Object documentation说:

An object is an unordered set of name/value pairs.

因此,大多数库默认情况下不关心顺序并使用无序 Map实现。最多可以维持 JSON 的订单使用LinkedHashMap有效负载或任何其他类似的实现。但为了强制排序,我们需要自定义配置。

对于Gson它可以看起来像这样:

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.TypeAdapter;
import com.google.gson.TypeAdapterFactory;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Map;
import java.util.TreeMap;

public class GsonApp {

public static void main(String[] args) throws Exception {
File jsonFile = new File("./resource/test.json").getAbsoluteFile();

Gson gson = new GsonBuilder()
.setPrettyPrinting()
.registerTypeAdapterFactory(new TreeMapTypeAdapterFactory())
.create();

Map root = gson.fromJson(new FileReader(jsonFile), Map.class);
System.out.println(gson.toJson(root));
}
}

class TreeMapTypeAdapterFactory implements TypeAdapterFactory {

public final <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
if (Map.class.isAssignableFrom(type.getRawType())) {
final TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type);
return createCustomTypeAdapter(delegate);
}

return null;
}

private <T> TypeAdapter<T> createCustomTypeAdapter(TypeAdapter<T> delegate) {
return new TypeAdapter<T>() {
@Override
public void write(JsonWriter out, T value) throws IOException {
Map map = (Map) value;
delegate.write(out, (T) new TreeMap(map));
}

@Override
public T read(JsonReader in) throws IOException {
return delegate.read(in);
}
};
}
}

对于JSON应用程序打印上方的有效负载:

{
"age": 22.0,
"attributes": {
"COMMERCIALNAME_E": "SADD MAARAB PHARMACY",
"FACILITYSUBTYPE": "24 Hr Pharmacy",
"FACILITYTYPE": "Pharmacy",
"OBJECTID": "35"
},
"foods": [
{
"price": 100.0,
"product": "apple"
},
{
"fruit": "banana",
"price": 100.0
}
],
"name": "John"
}

关于java - 将 JSON 转换为排序 JSON,其中包含嵌套节点中的 JSONArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59076012/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com