Как обработать массив JSON, вложенный в массив в Java - PullRequest
0 голосов
/ 17 мая 2018

Вот класс Java CreateDoc , который отправляется из одного веб-сервиса, который является стороной производителя, в другой веб-сервис, который является стороной потребителя, как List с типом контента: Json

Ниже приведено представление класса

class CreateDoc{
     DocMetData dMetaData;
     DocContent dCont;
}

Class DocMetData {
     String docNamel
     String docType;
}

Class DocContent {
     String data;
}

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

Ниже приведено представление:

[  
   [  
      {  
         "dMetaData":{  
            "docName":"string",
            "docType":"pdf"
         },
         "dCont":{  
            "data":"abc"
         }
      },
      {  
         "dMetaData":{  
            "docName":"string",
            "docType":"pdf"

         },
         "dCont":{  
            "data":"def"
         }
      },
      {  
         "dMetaData":{  
            "docName":"string",
            "docType":"pdf"

         },
         "dCont":{  
            "data":"ghk"
         }
      }
   ]
]

Вопрос в том, как это обработать и использовать данные и представлять их в виде списка.

Ответы [ 4 ]

0 голосов
/ 18 мая 2018

Вы можете использовать JSONArray (org.json), чтобы проанализировать первый список, и проанализировать с GSON внутренний список, чтобы создать Список CreatDoc.Вы можете использовать только GSON для анализа первого массива тоже

import java.util.ArrayList;
import java.util.List;

import org.json.JSONArray;

import com.google.common.reflect.TypeToken;
import com.google.gson.Gson;

public class Deserializer {

public static void main(String[] args) {
    JSONArray jsonArray = new JSONArray(
            "[[{\"dMetaData\": {\"docName\": \"string\",\"docType\": \"pdf\"},\"dCont\": {\"data\": \"abc\"}},{\"dMetaData\": {\"docName\": \"string\",\"docType\": \"pdf\"},\"dCont\": {\"data\": \"def\"}},{\"dMetaData\": {\"docName\": \"string\",\"docType\": \"pdf\"},\"dCont\": {\"data\": \"ghk\"}}]]");
    JSONArray docsArray = jsonArray.getJSONArray(0);
    List<CreateDoc> docsList = new Gson().fromJson(docsArray.toString(),
            new TypeToken<ArrayList<CreateDoc>>() {}.getType());
    docsList.forEach(System.out::println);
}

public static class CreateDoc {

    DocMetData dMetaData;
    DocContent dCont;

    @Override
    public String toString() {
        return this.dMetaData.toString() + " " + this.dCont.toString();
    }
}
public static class DocMetData {

    String docName;
    String docType;

    @Override
    public String toString() {
        return "name: " + this.docName + " type: " + this.docType;
    }
}
public static class DocContent {

    String data;

    @Override
    public String toString() {
        return "data: " + this.data;
    }
}

}

0 голосов
/ 17 мая 2018

Я думаю, проблема в том, что вы пытаетесь сопоставить JSON с CreateDoc вместо CreateDoc List.Если вы используете весеннюю загрузку для управления слоем отдыха в вашем приложении, используйте @Requestbody List CreateDoc в методе для преобразования вашего json.Это будет использовать конвертер Джексона внутри.В противном случае вы можете использовать jar конвертер jar для конвертации вашего json в объекты.

0 голосов
/ 17 мая 2018

Вот пример кода, который показывает, как вы можете использовать Jackson ObjectMapper для анализа данных. Обратите внимание, что в коде предполагается, что данные хранятся в файле, вы можете изменить его по мере необходимости в соответствии с вашими потребностями.

Вот основной класс:

package parsing.arrayofarray;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class ArrayOfArray {

    public static void main(String[] args) {
        ObjectMapper mapper = new ObjectMapper();
        String data = null;
        try {
            data = new String(Files.readAllBytes(Paths.get("src/main/resources/jsonArrayOfArray.json")));
        } catch (IOException e1) {
            e1.printStackTrace();
        }

        List<List<CreateDoc>> results = null;

        try {
            results = mapper.readValue(data, new TypeReference<List<List<CreateDoc>>>(){});
        } catch (JsonParseException e) {
            e.printStackTrace();
        } catch (JsonMappingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println(results);
    }

}

и вот вспомогательные классы, сначала CreateDoc:

package parsing.arrayofarray;

public class CreateDoc {
    DocMetData dMetaData;
    DocContent dCont;
    public DocMetData getdMetaData() {
        return dMetaData;
    }
    public void setdMetaData(DocMetData dMetaData) {
        this.dMetaData = dMetaData;
    }
    public DocContent getdCont() {
        return dCont;
    }
    public void setdCont(DocContent dCont) {
        this.dCont = dCont;
    }
    @Override
    public String toString() {
        return "CreateDoc [dMetaData=" + dMetaData + ", dCont=" + dCont + "]";
    }
}

и DocContent:

package parsing.arrayofarray;

public class DocContent {
    @Override
    public String toString() {
        return "DocContent [data=" + data + "]";
    }

    String data;

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }
}

и DocMetData:

package parsing.arrayofarray;

public class DocMetData {
    String docName;
    String docType;
    public String getDocNamel() {
        return docName;
    }
    public void setDocName(String docName) {
        this.docName = docName;
    }
    @Override
    public String toString() {
        return "DocMetData [docNamel=" + docName + ", docType=" + docType + "]";
    }
    public String getDocType() {
        return docType;
    }
    public void setDocType(String docType) {
        this.docType = docType;
    }
}

Вывод из println:

[[CreateDoc [dMetaData=DocMetData [docNamel=string, docType=pdf], dCont=DocContent [data=abc]], CreateDoc [dMetaData=DocMetData [docNamel=string, docType=pdf], dCont=DocContent [data=def]], CreateDoc [dMetaData=DocMetData [docNamel=string, docType=pdf], dCont=DocContent [data=ghk]]]]
0 голосов
/ 17 мая 2018

Вы можете использовать GSON , чтобы проанализировать сообщение в JSONArray с JSONObjects.Затем создайте анализатор для каждого класса, чтобы преобразовать поля из JSONObject в объекты Java.На такой же вопрос ответили здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...