Как изменить значения Json [duplicate]

Отличные ответы выше. Я хочу только добавить, что внутри области вашей функции вы можете присвоить значение этой переменной переменной 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);
21
задан Brian Tompsett - 汤莱恩 11 December 2015 в 20:53
поделиться

2 ответа

Вам просто нужно создать структуру класса 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);
40
ответ дан MikO 21 August 2018 в 07:53
поделиться

В зависимости от того, что вы пытаетесь сделать. Вы можете просто настроить иерархию 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 + '}';
  }
}
10
ответ дан PrashanD 21 August 2018 в 07:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: