2014-10-23 3 views
-4

В моем Android приложение, которое я json, который выглядит как:Анализировать JSON для нужного объекта

{ 
    "Records": [ 
     { 
      "RowIndex": "0", 
      "NameValue": { 
       "Name": "PropertyName1", 
       "Value": "PropertyValue1" 
      } 
     }{ 
      "RowIndex": "1", 
      "NameValue": { 
       "Name": "PropertyName2", 
       "Value": "PropertyValue2" 
      } 
     } 
    ] 
} 

Мне нужно PARCE это JSON объекта, который выглядит следующим образом:

public class MyClass { 
    public String PropertyName1; 
    public String PropertyName2; 
} 

и результат после синтаксический анализ должен быть:

public String PropertyName1 = "PropertyValue1"; 
public String PropertyName2 = "PropertyValue2"; 

в основном, первый JSON является эквивалентом:

{ 
    "PropertyName1" : "PropertyValue1", 
    "PropertyName2" : "PropertyValue2" 
} 

Вопрос: Как я могу обработать первый json без использования swith/case для поиска необходимой недвижимости?

+3

JSON выглядит неловко. Ты сделал это? Если это так, я бы предложил использовать другую схему именования. Естественно делать «PropertyName2»: «PropertyValue2». Это упрощает анализ. – RvdK

+0

@RvdK, я знаю, но, к сожалению, я не могу его изменить (я использую существующий API).На данный момент у меня есть только одна идея - создать новый json (как второй в моем сообщении) из существующего (как первый в моем сообщении), и только после этого - запустите второй json для объекта. – jimpanzer

+0

@ downvoters, пожалуйста, оставьте комментарий ... – jimpanzer

ответ

1

Один из способов, который я могу придумать (который не звучит слишком велик), - это фактически создать объект, соответствующий ответу JSON, который вы вернетесь. Затем карта, которая NameValue объект MyClass

Итак, что-то вроде

public class NameValue { 
    public string Name; 
    public String Value; 

    public MyClass getMyClass(){ 
     MyClass myClass = new MyClass(); 
     myClass.PropertyName2 = Value; 
     return myClass; 
    } 
} 

Вы можете придумать лучший способ отображения его, очевидно. Но это всего лишь пример того, что я мог бы сделать, если бы мне дали ответ JSON, о котором я не особо заботился. Аналогичным образом можно изменить его (у MyClass можно создать объект NameValue), чтобы вы могли отправить данные обратно в правильном формате.

2

Вам придется спуститься по темному пути отражения, которого я боюсь. вы можете проанализировать json в промежуточном объекте, который имеет карту для namevalue.

, то вы используете приведенный ниже код (конечно, просто скопируйте нужные вам биты), чтобы перебрать карту пар ключ/значение. для каждой клавиши найдите нужное поле и установите его. Если вам гарантируется только необходимость устанавливать общедоступные переменные, вы можете использовать getFields и можете пропустить setAccessible.

public class Test { 
    public static void main(String[] argv) { 
     MyClass myClass = new MyClass(); 
     Class<?> classObject = myClass.getClass(); 

//  Field fields[] = classObject.getFields(); // if you want to get only public fields. 
     Field fields[] = classObject.getDeclaredFields(); // any field 
     for(Field f : fields) { 
      System.out.println(f.getName()); 
      try { 
       // if member is private: security managers may object but the default java allows it 
       f.setAccessible(true); 
       f.set(myClass, "abc"); 
      } catch (IllegalAccessException e) { 
       // handle access exception: 
       e.printStackTrace(); 
      } 
     } 

     System.out.println("prop 1: " + myClass.PropertyName1); 
     System.out.println("prop 2: " + myClass.PropertyName2); 
    } 


    public static class MyClass { 
     public String PropertyName1; 
     private String PropertyName2; 
    } 
} 

Фактически .. есть неосновный способ, но это заменит вашу реализацию объекта, который у вас есть.

Если вы измените класс:

public class MyClass { 
    public String PropertyName1; 
    public String PropertyName2; 
} 

к

public class MyClass { 
    private Map<String, String> properties = new HashMap<String, String>(); 
    public void setProperties(Map<String, String> props) { this.properties = props; } 
    public String getPropertyName1() { 
     return lookupProperty("PropertyName1"); 
    } 
    public String getPropertyName2() { 
     return lookupProperty("PropertyName2"); 
    } 
    private String lookupProperty(String property) { 
     if (properties.containsKey(property) { 
      return properties.get(property); 
     } else { 
      return null; 
     } 
    } 
} 

тогда можно разобрать карту значения имя в карту, и построить MyClass с ним. , просто перечисляя его для полноты, хотя изменение модели вашего домена в соответствии с входом json не является идеальным.

Я бы рекомендовал любой способ выполнить синтаксический анализ ввода, а затем скопировать модель в ваш фактический объект домена, а не использовать json-model в вашем приложении. таким образом, если модель json когда-либо изменится, ваша модель домена не изменится.

+0

Мне нравится вторая половина этого ответа. Использование «Карты» - действительно хорошая идея. – kentarosu

Смежные вопросы