簡體   English   中英

PHP Json關聯數組到Java映射

[英]Php Json Associative Array To Java Map

我的問題是,PHP根據數組是連續的還是以零索引開頭的方式對數組進行不同的編碼。 例:

$arr = array(array(12), array(13));
===> [[12], [13]]

$arr = array("0" => array(12), "1" => array(13));
===> [[12], [13]]

$arr = array("0" => array(12), "2" => array(13));
===> {"0": [12], "2": [13]}

為什么第三個是如此不同?

第一個示例產生一個列表列表,第三個示例產生一個帶有列表的對象。 我需要將所有這些都轉換為Java的Map<Integer, List<Double>> 這是我可以在Java中為這些PHP對象找到的最通用的數據類型。 我正在使用Google的Gson。 但是,由於這些示例生成了不同類型的對象,因此我不能僅將其讀入地圖。 我必須首先檢查它是否具有索引,然后將其一個接一個地添加到自定義地圖中。 請查看標有“做這部分的更好方法”的行。 這是我的代碼:

import java.lang.StringBuilder;
import com.google.gson.*;
import com.google.gson.reflect.*;
import java.util.Map;
import java.util.HashMap;
import java.util.List;

public class Saving {

    public static void main(String[] args) {

        String json = "[[12], [13]]";
        json = json.trim();
        Map<Integer, List<Double>> fuelSavings = null;

        // such a cluster****
        if(json.startsWith("[[")) { // THERE HAS TO BE A BETTER WAY TO DO THIS PART
        // ANY WAY I CAN AVOID THIS ENTIRE IF CONDITION

            //implicit keys
            fuelSavings = new HashMap<Integer, List<Double>>();
            List<List<Double>> temporaryList = new Gson().fromJson(json, new TypeToken<List<List<Double>>>(){}.getType());
            int index = 0;
            for(List<Double> temporaryListMember: temporaryList) {
                fuelSavings.put(index, temporaryListMember);
                index++;
            }

        } else {

            // explicit keys
            // THIS PART IS PERFECT
            fuelSavings = new Gson().fromJson(json, new TypeToken<Map<Integer, List<Double>>>(){}.getType());

        }

        System.out.println(fuelSavings);

    }

}

任何幫助表示贊賞,謝謝!

您在PHP中所做的是兩件事。 PHP中的數組用作數組,地圖,列表。

array(array(12), array(13)); array("0" => array(12), "2" => array(13)); 即使在PHP中也不一樣。

使用Gson在Java中需要做的是將json解析為String,並檢查主要對象是Map還是List ,然后提出建議。 如果已加載列表,則知道它是一個array(array(12), array(13)); 否則就是另一個。

您不能從PHP方面做一些事情來生成始終相同的東西嗎?

編輯:

如果您不能從PHP方面做任何事情,那么您的檢查將與實例化JsonParser解析相同,然后檢查JsonObject.isJsonArray()返回true,不同之處在於它最終會更快,但您將不必依賴gson庫。

Map<Integer, List<Double>> fuelSavings = null;
JsonElement jElement = new JsonParser().parse("[[12], [13]]");
JsonObject jObject = jelement.getAsJsonObject();
if (jObject.isJsonArray()) {
    fuelSavings = new HashMap<Integer, List<Double>>();
    List<List<Double>> temporaryList = new Gson().fromJson(jElement, new TypeToken<List<List<Double>>>(){}.getType());
    int index = 0;
    for(List<Double> temporaryListMember: temporaryList) {
        fuelSavings.put(index++, temporaryListMember);
    }
} else /* this is a map */ {
    fuelSavings = new Gson().fromJson(jElement, new TypeToken<Map<Integer, List<Double>>>(){}.getType());
}

很有意思!

據我了解,PHP服務器將其數據作為編碼為JSON的有序映射提供服務,但不幸的是,有時它的鍵是連續的整數,這使得json_encode()理解為簡單數組,並為輸出的JSON使用不同的格式。

據我了解,所有PHP數組都是有序映射。 但是,當一個數組具有連續的整數鍵時, json_encode()在“ JSON Object”(映射)中插入一個沒有鍵的數組。 這破壞了不希望使用數組而不是“對象”的客戶代碼。

令人難以置信的是,我發現現有的Java函數都無法將JsonArray轉換為JsonObject ,而且如果我們嘗試將數組作為Object進行獲取,有時甚至可能會遇到一些異常! 天哪,一個JsonArray只是一個具有隱式連續整數鍵的JsonObject ,應該自動JsonArray :p

我沒有嘗試過,但是也許JsonObject::entrySet()可以解決它。 它返回一個Set<Map.Entry<String,JsonElement>> ,這也許可以被轉換為一個Map<Integer, AnyObject>如果整數自動解析字符串和JsonElement可以用一個適當的轉換TypeToken

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM