将JSON转换为在嵌套节点中包含JSONArray的排序JSON

问题描述 投票:0回答:2

[我想知道的是,如何将未排序的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",
}

有人可以帮助我达到此要求吗?

java json string key-value alphabetical
2个回答
0
投票

对象是名称/值对的无序集合。

因此,大多数库默认情况下都不关心顺序,并且使用无序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"
}

0
投票
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(" ")); }
© www.soinside.com 2019 - 2024. All rights reserved.