如何在java中处理嵌套在Array中的JSON数组

时间:2018-05-17 19:39:52

标签: java json jackson

这是一个java类 CreateDoc ,它是从生产者一方的Web服务发送到另一个Web服务,消费者方面是List,其中<​​strong>内容类型:Json

以下是班级代表

class CreateDoc{
     DocMetData dMetaData;
     DocContent dCont;
}

Class DocMetData {
     String docNamel
     String docType;
}

Class DocContent {
     String data;
}

一旦我在消费者端收到List作为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"
         }
      }
   ]
]

问题是如何处理这个并且能够使用数据并表示为List。

4 个答案:

答案 0 :(得分:1)

这里有一些示例代码,展示了如何使用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]]]]

答案 1 :(得分:1)

您可以使用JSONArray(org.json)来解析第一个列表,并使用GSON解析内部列表以创建CreatDoc列表。您也可以只使用GSON来解析第一个数组

student_scores = {'0': 65.0, '1': 54.7}
average_score = 65.0
i = 0
above_avg = []

for student, score in student_scores.items():
    if score >= average_score:
       above_average_check = '{}:  {}'.format(student, score)
       above_avg.append(above_average_check)
       print(above_average_check)
    i += 1

}

答案 2 :(得分:-1)

您可以使用GSON将消息解析为带有JSONObjects的JSONArray。然后为每个类创建一个解析器,将JSONObject中的字段转换为Java对象。类似的问题是here

答案 3 :(得分:-1)

我认为问题是你试图将json映射到CreateDoc而不是CreateDoc List。如果您使用spring boot来管理应用程序中的rest层,请在方法中使用@Requestbody List CreateDoc来转换您的json。这将在内部使用Jackson转换器。否则,您可以使用Jackson转换器jar将您的json转换为对象。