cuốn sách gpt4 ai đã làm

Moshi xác định xem JSON là một mảng hay một đối tượng

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-02 19:08:58 26 4
mua khóa gpt4 Nike

Có cách nào để thiết lập Moshi không bộ chuyển đổitự động tạo một Objecthoặc Danh sách<đối tượng="">Dựa trên phản hồi JSON? Hiện tại tôi có thể làm điều này một cách rõ ràng. Ví dụ: tôi có thể nhận được phản hồi sau:

{
"ID người dùng": "1",
"id": "2",
"cơ thể": "cơ thể...",
"tiêu đề": "tiêu đề..."
}

或者

[
{
"ID người dùng": "1",
"id": "2",
"cơ thể": "cơ thể...",
"tiêu đề": "tiêu đề..."
}
]

Tôi muốn tạo Objecthoặc Danh sách<đối tượng="">Không cần phải chỉ định rõ ràng nên sử dụng cái nào.

câu trả lời hay nhất

Bạn có thể khái quát hóa điều này bằng cách sử dụng JsonQualifier. Từ ví dụ của bạn, bạn có thể sử dụng nó như thế này

lớp cuối cùng Foo {
@SingleToArray Danh sách người dùng cuối cùng ;
}

Dưới đây là mã với các bài kiểm tra để chứng minh đầy đủ hơn.

@Retention(RUNTIME)
@JsonQualifier công khai @interface SingleToArray {
Bộ điều hợp lớp cuối cùng mở rộng JsonAdapter<>> {
JsonAdapter cuối cùng<>> delegateAdapter;
phần tử JsonAdapter cuối cùng;

công khai tĩnh Nhà máy FACTORY = new Factory() {
@Nullable @Override
chú thích public JsonAdapter create(Type type, Set,
Moshi moshi) {
Đặt delegateAnnotations =
Type.nextAnnotations(chú thích, SingleToArray.class);
if (delegateAnnotations == null) {
return null;
}
if (Types.getRawType(type) != List.class) {
ném IllegalArgumentException mới (
"Chỉ các danh sách mới có thể được chú thích bằng @SingleToArray. Đã tìm thấy: " + type);
}
Nhập elementType = Type.collectionElementType(type, List.class);
JsonAdapter<>> delegateAdapter = moshi.adapter(type, delegateAnnotations);
JsonAdapter elementAdapter = moshi.adapter(elementType);
trả về Bộ điều hợp mới (delegateAdapter, elementAdapter);
}
};

Adaptor(JsonAdapter<>> delegateAdapter, JsonAdapter elementAdapter) {
this.delegateAdapter = delegateAdapter;
this.elementAdapter = elementAdapter;
}

@Nullable @Override public List fromJson(JsonReader reader) ném IOException {
if (reader.peek() != JsonReader.Token.BEGIN_ARRAY) {
return Collections.singletonList(elementAdapter.fromJson(reader));
}
trả về delegateAdapter.fromJson(reader);
}

@Ghi đè public void toJson(người viết JsonWriter, giá trị @Nullable List)
ném IOException {
if (value.size() == 1) {
elementAdapter.toJson(writer, value.get(0));
} khác {
delegateAdapter.toJson(người viết, giá trị);
}
}
}
}

@Test public void singleToArray() ném ngoại lệ {
Moshi moshi = new Moshi.Builder().add(SingleToArray.Adapter.FACTORY).build();
Bộ chuyển đổi JsonAdapter<>> =
moshi.adapter(Types.newParameterizedType(List.class, String.class), SingleToArray.class);
khẳng địnhThat(adapter.fromJson("[\"Tom\",\"Huck\"]")).isEqualTo(Arrays.asList("Tom", "Huck"));
khẳng địnhThat(adapter.toJson(Arrays.asList("Tom", "Huck"))).isEqualTo("[\"Tom\",\"Huck\"]");
khẳng địnhThat(adapter.fromJson("\"Jim\"")).isEqualTo(Collections.singletonList("Jim"));
khẳng địnhThat(adapter.toJson(Collections.singletonList("Jim"))).isEqualTo("\"Jim\"");
khẳng địnhThat(adapter.fromJson("[]")).isEqualTo(Collections.emptyList());
khẳng địnhThat(adapter.toJson(Collections.emptyList())).isEqualTo("[]");
}

Về java - Moshi xác định xem JSON là một mảng hay một đối tượng, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/49165604/

26 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress