Отличные ответы выше. Я хочу только добавить, что внутри области вашей функции вы можете присвоить значение этой переменной переменной let self = this;
, а затем внутри обратного вызова просто обратиться к данным типа self.data
.
Ваш код :
function MyConstructor(data, transport) {
this.data = data;
let self = this; //ADD THIS LINE
transport.on('data', function () {
alert(self.data); //USE IT LIKE THIS
});
}
// Mock transport object
var transport = {
on: function(event, callback) {
setTimeout(callback, 1000);
}
};
// called as
var obj = new MyConstructor('foo', transport);
Вам просто нужно создать структуру класса Java, которая представляет данные в вашем JSON. Для этого я предлагаю вам скопировать ваш JSON в этот онлайн-просмотрщик JSON , и вы увидите структуру вашего JSON намного яснее ...
В принципе вам нужно эти классы (псевдокод):
class Response
Data data
class Data
List<ID> id
class ID
Stuff stuff
List<List<Integer>> values
String otherStuff
Обратите внимание, что имена атрибутов в ваших классах должны совпадать с именами ваших полей JSON! Вы можете добавить больше атрибутов и классов в соответствии с вашей фактической структурой JSON ... Также обратите внимание, что вам нужны геттеры и сеттеры для всех ваших атрибутов!
Наконец, вам просто нужно разобрать JSON в вашей структуре класса Java с:
Gson gson = new Gson();
Response response = gson.fromJson(yourJsonString, Response.class);
И все! Теперь вы можете получить доступ ко всем своим данным в объекте response
, используя геттеры и сеттеры ...
Например, чтобы получить доступ к первому значению 456
, вам нужно будет сделать:
int value = response.getData().getId().get(0).getValues().get(0).get(1);
В зависимости от того, что вы пытаетесь сделать. Вы можете просто настроить иерархию POJO, которая соответствует вашему json
, как показано здесь здесь (предпочтительный метод). Или вы можете предоставить собственный десериализатор . Я имел дело только с данными id
, поскольку я предполагал, что это была сложная реализация, о которой идет речь. Просто пройдите через json
, используя типы gson
, и создайте данные, которые вы пытаетесь представить. Классы Data
и Id
представляют собой только pojos
, состоящие из свойств исходной строки json
и отражающие их.
public class MyDeserializer implements JsonDeserializer<Data>
{
@Override
public Data deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) throws JsonParseException
{
final Gson gson = new Gson();
final JsonObject obj = je.getAsJsonObject(); //our original full json string
final JsonElement dataElement = obj.get("data");
final JsonElement idElement = dataElement.getAsJsonObject().get("id");
final JsonArray idArray = idElement.getAsJsonArray();
final List<Id> parsedData = new ArrayList<>();
for (Object object : idArray)
{
final JsonObject jsonObject = (JsonObject) object;
//can pass this into constructor of Id or through a setter
final JsonObject stuff = jsonObject.get("stuff").getAsJsonObject();
final JsonArray valuesArray = jsonObject.getAsJsonArray("values");
final Id id = new Id();
for (Object value : valuesArray)
{
final JsonArray nestedArray = (JsonArray)value;
final Integer[] nest = gson.fromJson(nestedArray, Integer[].class);
id.addNestedValues(nest);
}
parsedData.add(id);
}
return new Data(parsedData);
}
}
Тест:
@Test
public void testMethod1()
{
final String values = "[[123, 456], [987, 654]]";
final String id = "[ {stuff: { }, values: " + values + ", otherstuff: 'stuff2' }]";
final String jsonString = "{data: {id:" + id + "}}";
System.out.println(jsonString);
final Gson gson = new GsonBuilder().registerTypeAdapter(Data.class, new MyDeserializer()).create();
System.out.println(gson.fromJson(jsonString, Data.class));
}
Результат:
Data{ids=[Id {nestedList=[[123, 456], [987, 654]]}]}
POJO:
public class Data
{
private List<Id> ids;
public Data(List<Id> ids)
{
this.ids = ids;
}
@Override
public String toString()
{
return "Data{" + "ids=" + ids + '}';
}
}
public class Id
{
private List<Integer[]> nestedList;
public Id()
{
nestedList = new ArrayList<>();
}
public void addNestedValues(final Integer[] values)
{
nestedList.add(values);
}
@Override
public String toString()
{
final List<String> formattedOutput = new ArrayList();
for (Integer[] integers : nestedList)
{
formattedOutput.add(Arrays.asList(integers).toString());
}
return "Id {" + "nestedList=" + formattedOutput + '}';
}
}