использование gson для анализа объекта json против массива json

<p>у меня есть json, который является либо отдельным объектом, либо массивом того же объекта. есть ли способ проанализировать эти данные с помощью gson, где он будет отличать один объект от массива?</p><p>единственное решение, которое у меня есть в настоящее время для этого, состоит в том, чтобы вручную проанализировать json и окружить его попыткой catch. сначала я попытаюсь разобрать его как один объект, если он не удастся, он выдаст исключение, а затем я попытаюсь проанализировать его как массив.</p><p>я не хочу анализировать это вручную, хотя ... это заняло бы у меня вечность .... вот идея того, что происходит.</p><pre><code>public class objecta implements serializable{ public string variable; public objectb[] objectb; //or objectb objectb; public objecta (){} } </code></pre><p>вот объект, который может быть массивом или отдельным объектом.</p><pre><code>public class objectb implements serializable{ public string variable1; public string variable2; public objectb (){} } </code></pre><p>а затем при взаимодействии с ответом json. я делаю это.</p><pre><code>gson gson = new gson(); objecta[] objectlist = gson.fromjson(response, objecta[].class); </code></pre><p>когда массив объектов objecta сериализуется, json содержит либо массив, либо отдельный объект для objectb.</p><pre><code>[ { "variable": "blah blah", "objectb": { "variable1": "1", "variable2": "2" } }, { "variable": "blah blah", "objectb": { "variable1": "1", "variable2": "2" } }, { "variable": "blah blah", "objectb": [ { "variable1": "1", "variable2": "2" }, { "variable1": "1", "variable2": "2" } ] } ] </code></pre>

<p>я только что изменил <code>objectb[]</code> на <code>list<objectb></code> в объявлении <code>objecta</code>.</p><pre><code>arraylist<objecta> la = new arraylist<objecta>(); list<objecta> list = new gson().fromjson(json, la.getclass()); for (object a : list) { system.out.println(a); } </code></pre><p>и это мой результат:</p><pre><code>{variable=blah blah, objectb={variable1=1, variable2=2}} {variable=blah blah, objectb={variable1=1, variable2=2}} {variable=blah blah, objectb=[{variable1=1, variable2=2}, {variable1=1, variable2=2}]} </code></pre><p>я думаю, что в эпоху дженериков, если у вас нет особых потребностей, вы можете переключаться с массивов на списки, у вас есть много преимуществ, которые gson также может использовать для гибкого анализа.</p>

<p>попробуйте использовать com.google.gson.jsonparser. </p><pre><code> string jsonstring = "object json representation"; jsonparser jsonparser = new jsonparser(); jsonelement jsonelement = jsonparser.parse(jsonstring); if (jsonelement.isjsonarray()) { // some logic } </code></pre><p>есть разные способы получить ваш объект, например, с помощью экземпляра jsonelement - просто с помощью методов com.google.gson.gson:</p><pre><code>public <t> t fromjson(com.google.gson.jsonelement json, java.lang.class<t> classoft) throws com.google.gson.jsonsyntaxexception public <t> t fromjson(com.google.gson.jsonelement json, java.lang.reflect.type typeoft) throws com.google.gson.jsonsyntaxexception </code></pre><p>итак, изучите классы jsonelement, jsonarray, jsonprimitive, jsonnull и jsonobject. поверьте, у них есть адекватный интерфейс для восстановления вашего объекта. </p>

<p>можете ли вы попробовать/поймать его, сначала попытавшись проанализировать массив, а затем вернуться к анализу класса одного объекта? </p><p>вы также можете сделать очень простой тест и посмотреть на первый непробельный символ в строке, которую вы десерализуете, если это «{», то это отдельный объект, если это «[», то это массив</p>