1. Java / Говнокод #11571

    +75

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    private void viewField(int id) {
            try {
                List<Fieldmaterials> materials = materialsSession.FieldmaterialsBy(id);
                int size = materials.size() - 1;
                int i = 0;
                JSONWriter json = new JSONStringer().object();
                json.key("namefield").array();
    
                while (i <= size) {
                    Fieldmaterials get = materials.get(i);
                    json.value(get.getNamefield());
                    i++;
                }
                json.endArray();
                json.key("typefield").array();
    
                i = 0;
                while (i <= size) {
                    Fieldmaterials get = materials.get(i);
                    json.value(get.getTypefield());
                    i++;
                }
    
                json.endArray();
                json.key("orderfield").array();
    
                i = 0;
                while (i <= size) {
                    Fieldmaterials get = materials.get(i);
                    json.value(get.getOrderfieldmaterials());
                    i++;
                }
                json.endArray().endObject();
    
            } catch (Exception e) {
                e.printStackTrace();
            }

    Не нашел более хорошего способа сериализовать в JSON. Нужно было оформить поля объектов в массивы, что-бы потом удобно разобрать в javascript

    Запостил: Kerny, 11 Августа 2012

    Комментарии (11) RSS

    • Ну можно через рефлекшн сделать, будет короче, но хз... еще вариант - на каком-нибудь Питоне написать скрипт, который это сгенерирует.
      ЗЫ. А почему не использовать форыч? Особо в этом свете не понятно size() - 1 и i <= size. Зачем лишние движения делать?
      Ответить
      • рефлекшн - тоже думал)
        Ответить
        • Gson тоже через reflection по дефолту рендерит.
          Ответить
        • По поводу size - это я затупил, тоже (( Хотя замечал, что лишние вычисления, но не менял - заюзаю форыч. Через рефлекшн, тоже думал. Даже написал небольшой пример.
          Ответить
    • package tests;
      
      import java.util.List;
      import java.util.ArrayList;
      import java.lang.reflect.Method;
      
      class Loops
      {
          private static class JSONObject
          {
              String getNameField()
              {
                  return "nameField";
              }
      
              String getTypeField()
              {
                  return "typeField";
              }
      
              String getOrderFieldMaterials()
              {
                  return "orderFieldMaterials";
              }
          }
      
          private static void test()
          {
              List<JSONObject> objects = new ArrayList<JSONObject>() {{
                      add(new JSONObject());
                      add(new JSONObject());
                      add(new JSONObject());
                      add(new JSONObject());
                  }};
              printInfo(objects, "getNameField");
              printInfo(objects, "getTypeField");
              printInfo(objects, "getOrderFieldMaterials");
          }
      
          private static void printInfo(List<JSONObject> objects, String method)
          {
              Class<?> jsonObject = JSONObject.class;
              try
              {
                  Method jsonMethod = jsonObject.getDeclaredMethod(method);
                  for (JSONObject object : objects)
                      System.out.format("%s%n", jsonMethod.invoke(object));
              }
              catch (Exception ex) { }
          }
          
          public static void main(String... args)
          {
              test();
          }
      }
      Безмозмезндо! (т.е. даром)
      Ответить
      • Спасибо, попробую, отпишусь. Просто мне нужна структура такого типа:
        {"namefield":["value1","value2","value3"],
        "typefield":["value1","value2","value3"],
        "orderfield":["value1","value2","value3"]
        }

        Чтобы у меня в javascript было 3 массива, которые я потом там разберу.
        Ответить
    • А вот к такому варианту как относитесь?
      private void viewField(int id) {
          try {
              List<Fieldmaterials> materials = materialsSession.FieldmaterialsBy(id);
              JSONWriter json = new JSONStringer();
      
              json.array();
      
              for (Fieldmaterials material : materials) {
                  json.object();
                  json.key("name").value(material.getNameField());
                  json.key("value").value(material.getValueField());
                  json.key("order").value(material.getOrderFieldMaterials());
                  json.endObject();
              }
      
              json.endArray();
      
          } catch (Exception e) {
              e.printStackTrace();
          }
          // ...
      }


      Если я не затупил - в результате получится вот такой JSON, который несложно использовать в JS:
      [
          {"name": "blabla", "value": "blabla", "order" : "blabla"},
          {"name": "blabla", "value": "blabla", "order" : "blabla"},
          {"name": "blabla", "value": "blabla", "order" : "blabla"}
      ]
      Ответить
      • Ну или идентичный вашему:
        private void viewField(int id) {
            try {
                List<Fieldmaterials> materials = materialsSession.FieldmaterialsBy(id);
                JSONWriter json = new JSONStringer().object();
        
                json.key("namefield").array();
                for (Fieldmaterials material : materials)
                    json.value(material.getNameField());
                json.endArray();
        
                json.key("typefield").array();
                for (Fieldmaterials material : materials)
                    json.value(material.getTypeField());
                json.endArray();
        
                json.key("orderfield").array();
                for (Fieldmaterials material : materials)
                    json.value(material.getOrderFieldMaterial());
                json.endArray();
        
                json.endObject;
        
            } catch (Exception e) {
                e.printStackTrace();
            }
            // ...
        }

        Тоже говнокод, конечно. Но меньший ;)
        Ответить
        • Ну, да. Просто более читабельно. Этот вариант кода тестовый, я его буду рефакторить в любом случае.
          Ответить
    • Попробуйте Gson, нам можно написать удобный адаптер для рендеринга своих типов.
      Ответить

    Добавить комментарий