2014-01-30 5 views
0

Я пытаюсь написать документ JSon и его относительный xsd-файл, чтобы генерировать классы JAXB, и я не думаю, что если я делаю это правильно. то, что я хочу, это структура, как это:массив массивов JSon

team 
    -name="name" 
    -game="game" 
    -intarray 
     int 
     int 
     ... 
     int 
    -values 
     [int1, int2] 
     [int1, int2] 
     ... 
     [int1, int2] 
    -stringarrays 
     [string1, string2,...., stringn] 
     [string1, string2,...., stringn] 
     ... 
     [string1, string2,...., stringn] 

поэтому я написал мой XSD и пример строки в файле JSON, чтобы попытаться прочитать его

example line: 
{"name": "Team 1", "game": "game", "intarray": [1, 2, 3, 4, 5, 6], "values": [[10,20], [10,80], [10,30], [10,60], [10,50], [10,30]], "stringarrays": [["Azione", "Azione"], ["Azione", "Azione"], ["Azione", "Azione"], ["Azione", "Azione"], ["Azione", "Azione"], ["Azione", "Azione"]]} 

и это мой XSD

<?xml version="1.0" encoding="UTF-8"?> 
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/teams" xmlns:tns="http://www.example.org/teams" elementFormDefault="qualified"> 

<element name="team_list" type="tns:lista_team"></element> 

<complexType name="team"> 
    <sequence> 
     <element name="name" type="string"></element> 
     <element name="game" type="string"></element> 
     <element name="intarray" type="int" maxOccurs="unbounded" 
      minOccurs="0"> 
     </element> 
     <element name="values" type="tns:ivev"></element> 
     <element name="stringarrays" type="tns:arrays"></element> 
    </sequence> 
</complexType> 

<complexType name="ivev"> 
    <sequence> 
     <element name="couple" type="tns:ivev_couple" maxOccurs="unbounded" minOccurs="0"></element> 
    </sequence> 
</complexType> 

<complexType name="ivev_couple"> 
    <sequence> 
     <element name="ivev_element" type="int" maxOccurs="unbounded" minOccurs="1"></element> 
    </sequence> 
</complexType> 

<complexType name="moveset"> 
    <sequence> 
     <element name="mosse" type="string" maxOccurs="unbounded" minOccurs="0"></element> 
    </sequence> 
</complexType> 

<complexType name="arrays"> 
    <sequence> 
     <element name="stringarray" type="tns:moveset" maxOccurs="unbounded" minOccurs="0"></element> 
    </sequence> 
</complexType> 

<complexType name="lista_team"> 
    <sequence> 
     <element name="squadra" type="tns:team" maxOccurs="unbounded" minOccurs="0"></element> 
    </sequence> 
</complexType> 

затмение продолжает говорить мне, что у меня есть MalformedJson, я Тхи пк проблема с JSon линии, я думаю, что XSD почти правильно, но я могу ошибаться :)

Код, который пишет документ JSON выглядит следующим образом:

Gson gson = new Gson(); 
String json = gson.toJson(team); 

try 
{ 
    FileWriter gwriter = new FileWriter("c:\\file.json"); 
    gwriter.write(json); 
    gwriter.close(); 
} 
catch(Exception e) 
{ 
} 

Который производит этот JSON документ:

{ 
    "nome":"team1", 
    "game":"game", 
    "intarray":[1,2], 
    "arrayofintarrays":{ 
    "couple":[] 
    }, 
    ‌​"arrayofstringarrays":{ 
    "mossearray":[] 
    } 
} 

Этот документ JSON затем считывают с так:

Team[] teams_loaded= null; 

try 
{ 
    Reader reader = new InputStreamReader(DexLoader.class.getClassLoader().getResourceAsStream("teams.tx‌​t")); 
    Gson gson = new GsonBuilder().create(); 
    JsonReader read = new JsonReader(reader); 
    teams_loaded = gson.fromJson(read, Team[].class); 
} 
catch(Exception c) 
{ 
    c.printStackTrace(); 
} 

спасибо!

+0

В стороне, не проще ли просто написать код Java, а не XSD, а затем сгенерировать код Java из него? –

+0

Я новичок в JSon, единственная попытка, которую я сделал для чтения JSon-файла, - это готовый и хорошо сделанный json-документ, я смог быстро генерировать классы и использовать их на eclipse, поэтому я подумал, что это лучший способ для продолжения – user3252485

+0

JSON в порядке, я могу разобрать его с помощью Java JSON API (javax.json: javax.json-api: 1.0 и org.glassfish: javax.json: 1.0.4). Какой API вы используете и каково исключение (включая стек), которое вы видите? Я предполагаю, что вы используете API GSON и что классы, созданные с вашего XSD, не соответствуют JSON. –

ответ

0

Вы пишете один экземпляр Team, а затем попытаетесь прочитать его как массив из Team. Ваш прочитанный код должен быть:

Team team = gson.fromJson(read, Team.class); 
+0

жаль, что я забыл сказать, что предложение json находится внутри файла [] в файле – user3252485

+0

, в нем говорится, что ожидаемый BEGIN_OBJECT, но был NUMBER в строке 2 столбца 84, который включен элемент «пара»: [1,2] – user3252485

+0

Анализ массива с использованием GSON был дан здесь: http://stackoverflow.com/questions/9853017/parsing-json-array-with-gson –

0

Кажется, что работа с элементами массива JSON немного сложнее в GSON. Вместо того, чтобы читать ваш файл как указано

Team[] teams_loaded= null  
teams_loaded = gson.fromJson(read, Team[].class) 

попытаться прочитать массив команд, как показано ниже.

@Test 
    public void testSampleGSON() { 
     String sample = "[{\"name\":\"Sharath\",\"age\":\"24\"},{\"name\":\"Sharath\",\"age\":\"24\"},{\"name\":\"Sharath\",\"age\":\"24\"},]"; 
     System.out.println(sample); 

     Gson gson = new Gson(); 
     Type t = new TypeToken<Person[]>() { 
     }.getType(); 
     Person[] pl = gson.fromJson(sample, t); 
     System.out.println(pl); 

     for (int i = 0; i < pl.length; i++) { 
      System.out.println(pl[i]); 
     } 
     String jsonString = gson.toJson(pl); 
     System.out.println(jsonString); 
    } 

Лицо класса является общедоступным классом в той же упаковке, как указано ниже.

public class Person { 
    String name; 
    String age; 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return this.name; 
    } 

    public String getAge() { 
     return this.age; 
    } 

    public void setAge(String age) { 
     this.age = age; 
    } 

Надеюсь, это поможет.

public String toString() { 
     return "Name : " + name + " Age : " + age; 
    } 
} 
+0

В приведенном выше коде введите Type t = new TypeToken () {} .getType(); Person [] pl = gson.fromJson (образец, t); Помог вам сохранить информацию о типе во время выполнения. –

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