[英]Transfer PHP associative array to Java Map<String, Double> using JSON (GSON)
[英]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.