2013-03-16 3 views
2

Я пытаюсь разобрать json-строку на объект java. В настоящее время код вручную считывает файл и генерирует Java-объект. Тем не менее, я хочу взять реализацию в gson.gson parsing inested json objects

Вот что я JSON получить от вызова веб-службы:

{ "comment": [ 
     "This file is used to define the behavior for the elements parsed.", 
     "Each entry in the file will have the format of element:name, skip:bool", 
     "If SkipFlag is true, it means that element need not be processed.", 
     "Convention used for elements and rule names is camelCase" 
    ], 
    "rules": [ { "element": "html", "skip": true }, 
       { "element": "head", "skip": true }, 
       { "element": "head", "skip": true }, 
       { "element": "body", "skip": true } 
    ] 
} 

мне нужно игнорировать комментарии и конвертировать правила. Вот тип Java Я пытаюсь определить для правила объекта Java:

// Arraylist < Map < elementname, Map < name, value > > > 
ArrayList< Map<String, Map<String, String> > > rules; 

Есть простой способ сделать это с gson?

ответ

3

Вы можете объявить конкретные классы:

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 

import com.google.gson.Gson; 

class Rule { 
    String element; 
    boolean skip; 
} 

class ElementParser { 
    String[] comment; 
    Rule[] rules; 
} 

public class JSonDecoder { 
    public static void main(String[] args) throws IOException { 
     try(BufferedReader reader = 
       new BufferedReader(new FileReader("Skip.json"))) { 
     System.out.println( 
      new Gson().fromJson(reader, ElementParser.class).toString()); 
     } 
    } 
} 

Здесь вы версия долго:

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 

import com.google.gson.Gson; 

class Rule { 
    String element; 
    boolean skip; 

    @Override public String toString() { 
     StringBuilder sb = new StringBuilder(); 
     sb.append('\t'); 
     sb.append(element); 
     sb.append(" ==> "); 
     sb.append(skip); 
     sb.append('\n'); 
     return sb.toString(); 
    } 
} 
class ElementParser { 
    String[] comment; 
    Rule[] rules; 

    @Override public String toString() { 
     StringBuilder sb = new StringBuilder(); 
     sb.append("Comment:\n"); 
     for(String c : comment) { 
     sb.append('\t'); 
     sb.append(c); 
     sb.append('\n'); 
     } 
     sb.append("Rules:\n"); 
     for(Rule r : rules) { 
     sb.append(r.toString()); 
     } 
     return sb.toString(); 
    } 
} 

public class JSonDecoder { 
    public static void main(String[] args) throws IOException { 
     try(BufferedReader reader = new BufferedReader(new FileReader("Skip.json"))) { 
     System.out.println( 
      new Gson().fromJson(reader, ElementParser.class).toString()); 
     } 
    } 
} 

Результат:

Comment: 
    This file is used to define the behavior for the elements parsed. 
    Each entry in the file will have the format of element:name, skip:bool 
    If SkipFlag is true, it means that element need not be processed. 
    Convention used for elements and rule names is camelCase 
Rules: 
    html ==> true 
    head ==> true 
    head ==> true 
    body ==> true 
+1

Правило - «только один ** общедоступный ** класс для каждого файла». http://docs.oracle.com/javase/specs/jls/se7/html/jls-7.html#jls-7.6 – Aubin

5

Используйте эту

GsonBuilder builder = new GsonBuilder();  
Gson gson = builder.enableComplexMapKeySerialization().create(); 
Type type = new TypeToken<ArrayList< Map<String, ArrayList<Map<String, String> > > >>() {}.getType(); 
ArrayList< Map<String, ArrayList<Map<String, String> > > > obj = gson.fromJson(str, type); 
+0

Можете ли вы объяснить немного PLS? Является ли спецификация типа в 'gson.fromJson' автоматически искать соответствующий тип из json? Я пытаюсь понять, как пропускается объект comment. – Kiran

+0

Спецификация типа (новый TypeToken и т. Д.) Помогает Gson сериализовать сложные типы (т. Е. Список объектов или даже карт, когда ключ получен из объекта, хотя в вашем случае ваша карта использует обычную строку). Я думаю, вы можете создать собственный тип, подходящий для вашей строки JSON, сериализовать его (включая комментарии!) И просто игнорировать их. –

2

Вы можете попробовать это тоже ..

класса данных для хранения ваших правил и комментарии класса

import java.util.List; 

public class Data { 

    private List<String> comments; 
    private List<Rule> rules; 

    public Data() {} 

    public List<String> getComments() { 
     return comments; 
    } 

    public void setComments(List<String> comments) { 
     this.comments = comments; 
    } 

    public List<Rule> getRules() { 
     return rules; 
    } 

    public void setRules(List<Rule> rules) { 
     this.rules = rules; 
    } 

} 

Правила для крепежного элемента и пропустить общественного класса Правило {

private String element; 
    private boolean skip; 

    public Rule() {} 

    public String getElement() { 
     return element; 
    } 

    public void setElement(String element) { 
     this.element = element; 
    } 

    public boolean isSkip() { 
     return skip; 
    } 

    public void setSkip(boolean skip) { 
     this.skip = skip; 
    } 

} 

Наконец, вы можете использовать что-то вроде этого для преобразования правил в json в java:

import java.io.BufferedReader; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.util.List; 

import com.google.gson.Gson; 

public class GsonTest { 

    public static void main(String[] args) throws FileNotFoundException { 
     BufferedReader bufferedReader = new BufferedReader(new FileReader("C:/Users/JESNAMOL/Desktop/json.txt"));//i have kept your json string in a file for demonstration 
     Gson gson = new Gson(); 
     Data data = gson.fromJson(bufferedReader, Data.class); 
     List<Rule> rules = data.getRules(); 

     for (Rule rule : rules) { 
      System.out.println("element: " + rule.getElement()); 
      System.out.println("skip: " + rule.isSkip()); 
     } 
    } 

} 
+0

не работает. правила становятся нулевыми. – Diffy