[我想知道的是,如何将未排序的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",
}
有人可以帮助我达到此要求吗?
对象是名称/值对的无序集合。
因此,大多数库默认情况下都不关心顺序,并且使用无序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" }
private static JsonValue deepsort(JsonValue value) {
if(value == null) return null;
else if(value.isLiteral()) return value.copy();
else if(value.isArray()) {
JsonArray newarray = JsonFactory.array();
for(JsonValue jsonValue : value.asArray().toList()) {
newarray.add(deepsort(jsonValue));
}
return newarray;
} else {
JsonObject newobject = JsonFactory.object();
List<JsonAttribute> attrs = value.asObject().toList();
Collections.sort(attrs, new Comparator<JsonAttribute>() {
@Override
public int compare(JsonAttribute o1, JsonAttribute o2) {
return o1.name().stringValue().compareTo(o2.name().stringValue());
}
});
for(JsonAttribute attr : attrs) {
newobject.add(attr.name().stringValue(), deepsort(attr.value()));
}
return newobject;
}
}
public static void main(String[] argv) {
String json = "{\n" +
" \"name\": \"John\",\n" +
" \"age\": 22,\n" +
" \"foods\": [{\n" +
" \"product\": \"apple\",\n" +
" \"price\": 100\n" +
" }, {\n" +
" \"fruit\": \"banana\",\n" +
" \"price\": 100\n" +
" }\n" +
" ],\n" +
"\n" +
" \"attributes\": {\n" +
" \"OBJECTID\": \"35\",\n" +
" \"FACILITYTYPE\": \"Pharmacy\",\n" +
" \"FACILITYSUBTYPE\": \"24 Hr Pharmacy\",\n" +
" \"COMMERCIALNAME_E\": \"SADD MAARAB PHARMACY\"\n" +
" }\n" +
"}";
JsonValue v = JsonParser.parse(json);
JsonValue newv = deepsort(v);
System.out.println(newv.toPrettyString(" "));
}