Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从java中嵌入的JSON字符串中提取值_Java - Fatal编程技术网

从java中嵌入的JSON字符串中提取值

从java中嵌入的JSON字符串中提取值,java,Java,我需要帮助将JSON数组字符串提取到对象数组中,以便以后可以对其进行处理 JSON字符串作为值嵌入到管道分隔字符串中,该字符串本身就是XML元素值 示例字符串如下所示 <MSG>registerProfile|.|D|D|B95||43|5000|43100||UBSROOT43|NA|BMP|508|{"biometrics":{"fingerprints":{"fingerprints":[{"position":"RIGHT_INDEX","image":{"format":"

我需要帮助将JSON数组字符串提取到对象数组中,以便以后可以对其进行处理

JSON字符串作为值嵌入到管道分隔字符串中,该字符串本身就是XML元素值

示例字符串如下所示

<MSG>registerProfile|.|D|D|B95||43|5000|43100||UBSROOT43|NA|BMP|508|{"biometrics":{"fingerprints":{"fingerprints":[{"position":"RIGHT_INDEX","image":{"format":"BMP","resolutionDpi":"508","data":"Qk12WQEAAAAAADYAAAA="}},{"position":"LEFT_INDEX","image":{"format":"BMP","resolutionDpi":"508","data":"Qk12WQEADoAAAA"}}]}}}</MSG>
我不是一名java开发人员,以下内容希望对您自己或其他能够提供更简洁的java语法的人有所帮助

首先,我们应该确定与您的价值相关的数据序列化的不同层次:

  • 这是一个外部XML元素,因此第一步是将该值解释为XML片段并提取XML值。
    • 我们在这个顶层使用XML反序列化,而不仅仅是使用字符串位置的原因是,内部值可能已被XML转义,因此我们需要使用XML编码规则解析内部值
    • 这就给我们留下了巨大的价值:
      registerProfile |.| D | D | B95 | | 43 | 5000 | 43100 | | | NA | BMP | 508 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 124“Qk12WQEADoAAAA”}}}]}}}
  • 下一个级别是管道分隔的,与CSV相同,只是转义字符是
    ,通常没有其他编码规则,因为
    不被视为正常词法域的一部分,我们不需要进一步转义。
    因此,可以将该字符串拆分为一个数组。
    • 我们感兴趣的值是数组中的第15个元素,这是您事先知道的,或者您可以简单地遍历元素以找到第一个以
      {
    • 这留下了一个JSON值:
      {“biometrics”:{“fingerprints”:{“fingerprints”:[{“position”:“RIGHT_INDEX”,“image”:{“format”:“BMP”,“resolutionDpi”:“508”,“data”:“qk12wqeaaaaadayaa=“},{“position”:“LEFT_INDEX”,“image”:{“format”:“BMP”,“resolutionDpi”:“508”,“data”:“qk12wqeadadaoaaa”}}}
  • 现在我们已经以JSON格式隔离了内部值,接下来通常要做的事情是将该值反序列化为对象。
    我知道OP要求使用数组,但是如果我们真的想使用正确的工具,我们可以将JSON对象实现为数组
  • 在C#中,上述过程非常简单,我相信Java中也应该如此,但我的尝试不断抛出错误

    因此,让我们假设(我知道…Ass-U-Me…)管道分隔数组中只有一个JSON值,有了这个知识,我们可以使用
    int String.IndexOf(str)

    [代码>字符串xml<<编码>字符串xml=“注册方文件”现场施工现场现场施工现场现场施工现场现场施工现场现场施工现场施工现场施工现场施工现场施工现场施工现场施工现场施工现场施工现场现场xml<音音音音音音音音音音音音音音音音音音码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码号号号号号号号号号方方方方方方方方。本本本本本本音音音音音音音音音音音音音音音音音音音音音音音音音音音音音音音音音码码码码码码码码码码码码号号号号号号方方方方方方方方音音音音音音音音音音音音左索引“,”图像“:{”格式“:”BMP“,”分辨率PI“:”508“\“数据\”:\“Qk12WQEADoAAAA \“}}]}}}”; int start=xml.indexOf('{'); int end=xml.lastIndexOf('}')+1;//+1,因为我们想包含最后一个字符,所以需要在它后面加索引 字符串json=xml.substring(开始、结束); 结果如下:
    {“生物特征”:{“指纹”:{“指纹”:{“位置”:“右索引”,“图像”:{“格式”:“BMP”,“分辨率PI”:“508”,“数据”:“QK12WQEAAAAAADYAAA=“}},{“位置”:“左索引”,“图像”:{“格式”:“BMP”,“分辨率PI”:“508”,“数据”:“Qk12WQEADoAAAA”}}

    格式化为漂亮:

    {
      "biometrics": {
        "fingerprints": {
          "fingerprints": [
            {
              "position": "RIGHT_INDEX",
              "image": {
                "format": "BMP",
                "resolutionDpi": "508",
                "data": "Qk12WQEAAAAAADYAAAA="
              }
            },
            {
              "position": "LEFT_INDEX",
              "image": {
                "format": "BMP",
                "resolutionDpi": "508",
                "data": "Qk12WQEADoAAAA"
              }
            }
          ]
        }
      }
    }
    
    一种方法是创建一个与此JSON值匹配的类结构,然后我们可以简单地对整个值执行
    。fromJson()
    ,让我们折衷一下,这样我们只需要为实际使用的数据定义内部类结构

    现在,从这个结构中我们可以看到,有一个外部对象只有一个名为
    生物特征
    的单一属性,这个值也是一个名为
    指纹
    的单一属性的对象。这个属性的值是另一个名为
    指纹
    的单一属性的对象,只是这次它有一个数组值

    以下是Java中的一个例子,我首先介绍了一个使用序列化(使用gson库)的示例,然后介绍了一个类似的实现,该实现仅使用简单的JSON库读取数组中的值

    试穿一下

    MyClass.java
    import java.util.*;
    导入java.lang.*;
    导入java.io.*;
    //导入javax.json.*;
    导入org.json.simple.JSONArray;
    导入org.json.simple.JSONObject;
    导入org.json.simple.parser.JSONParser;
    导入org.json.simple.parser.ParseException;
    导入com.google.gson.gson;
    公共类MyClass{
    公共静态void main(字符串参数[]){
    (3)43岁以上的5000人(12410)43100万;4310 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 10 10 10 10 10 10 10 10 10索引“,”图像“:{”格式“:”BMP“,”分辨率PI“:”508“,”数据“:\”Qk12WQEADoAAAA\“}}}]}}}”;
    int start=xml.indexOf('{');
    int end=xml.lastIndexOf('}')+1;//+1,因为我们想包含最后一个字符,所以需要在它后面加索引
    字符串jsonString=xml.substring(开始、结束);
    JSONParser=新的JSONParser();
    Gson Gson=新的Gson();
    尝试
    {
    //使用简单JSON(org.apache.clerezza.ext:org.JSON.simple:0.4)定位指纹内部数组
    JSONObject jsonRoot=(JSONObject)parser.parse(jsonString);
    JSONObject biometrics=(JSONObject)jsonRoot.get(“biometrics”);
    JSONObject fpOuter=(JSONObject)biometrics.get(“指纹”);
    JSONArray指纹=(JSONArray)fpOuter.get(“fingerpri
    
    {
      "biometrics": {
        "fingerprints": {
          "fingerprints": [
            {
              "position": "RIGHT_INDEX",
              "image": {
                "format": "BMP",
                "resolutionDpi": "508",
                "data": "Qk12WQEAAAAAADYAAAA="
              }
            },
            {
              "position": "LEFT_INDEX",
              "image": {
                "format": "BMP",
                "resolutionDpi": "508",
                "data": "Qk12WQEADoAAAA"
              }
            }
          ]
        }
      }
    }