使用JAVA访问JSON文件中的预期值

时间:2018-09-21 11:57:56

标签: java json

这是我正在使用的JSON文件

{"sentiment": 
    {"document": 
         {
             "label": "positive",
             "score": 0.53777
         }
    }
}

我需要访问labelscore中的值。使用Java。我该怎么办?

找到我现在正在使用的代码:

JSONParser parser = new JSONParser();
     try
     {
           Object object = parser
                   .parse(new FileReader("output_nlu_sentiment.json"));

           //convert Object to JSONObject
           JSONObject jsonObject = new JSONObject();
           JSONObject sentimentobject= new JSONObject();
           JSONObject documentobject = new JSONObject();

           sentimentobject= (JSONObject) jsonObject.get("sentiment");
           documentobject= (JSONObject) sentimentobject.get("document");

           String label = (String) documentobject.get("label");
           //float score = (float) jsonObject.get("score");
           System.out.println(label);


           String test = (String) sentimentobject.get("label");
           System.out.println(test);
        } catch(FileNotFoundException fe)
        {
           fe.printStackTrace();
        }
     catch(Exception e)
     {
        e.printStackTrace();
     }

为什么将值打印为null

6 个答案:

答案 0 :(得分:0)

您可能想看一下用于Jackson解析的JacksonXml。 现在的问题是您没有使用parser.parse(...)返回的JsonObject。 而是在刚创建的对象上使用get方法。当然,这意味着您不会获得想要的价格。

答案 1 :(得分:0)

请尝试使用以下代码(self.world[20:40, 30:50, :] = [135, 23, 53, 128] 而不是JSONObject jsonObject = (JSONObject) object),因为您根本没有使用对象,只需创建一个新的空JSONObject。

JSONObject jsonObject = new JSONObject();

答案 2 :(得分:0)

创建object时必须使用Object object = parser.parse(new FileReader("output_nlu_sentiment.json"));中创建的jsonObject

为此,您可以查看以下代码:

        Object object = parser
                .parse(new FileReader("file2.json"));

        //convert Object to JSONObject
        JSONObject jsonObject = (JSONObject) object;
        JSONObject sentimentobject= new JSONObject();
        JSONObject documentobject = new JSONObject();

        sentimentobject= (JSONObject) jsonObject.get("sentiment");
        documentobject= (JSONObject) sentimentobject.get("document");

        String label = (String) documentobject.get("label");
        //float score = (float) jsonObject.get("score");
        System.out.println(label);


        String test = (String) sentimentobject.get("label");

您将在控制台上打印出positive

答案 3 :(得分:0)

您应该在“ sentimentobject”段中看到内容,强制转换为JSONObject类无法获取所需的值。

答案 4 :(得分:0)

我更喜欢FasterXML Jackson支持将JSON解析为普通的旧Java对象(PO​​JO)。这些POJO通常称为数据传输对象(DTO),使您可以将JSON字段转换为相应DTO的正确类型的成员。

这是执行此操作的示例方法。因为FasterXML的实现会缓存信息以提高对象映射操作的效率,所以ObjectMapper通常在其他地方保持为静态。

static final ObjectMapper mapper = new ObjectMapper();

这是JSON反序列化方法:

public static <T> T deserializeJSON(
        final ObjectMapper mapper, final InputStream json,
        final Class<T> clazz)
        throws JsonParseException, UnrecognizedPropertyException,
                JsonMappingException, IOException
{
    final String sourceMethod = "deserializeJSON";
    logger.entering(sourceClass, sourceMethod);

    /*
     * Use Jackson support to map the JSON into a POJO for us to process.
     */
    T pojoClazz;

    pojoClazz = mapper.readValue(json, clazz);

    logger.exiting(sourceClass, sourceMethod);
    return pojoClazz;
}

假设我有一个名为FooDTO的类,该类具有适当的Jackson批注/获取器/设置器(请注意,您必须始终提供默认的空公共构造函数),您可以执行以下操作:

FooDTO foo = deserializeJSON(mapper, inputstream, FooDTO.class);

反序列化引发了一些不同的异常(所有这些异常都具有IOException作为其父类),您将需要处理这些异常或将其抛出给调用方。

答案 5 :(得分:0)

除了在注释和其他答案中提到的更正漏洞外,我还包括一些其他可以受益的更改:

不必使用要在下一行中重写的新实例来初始化JSONObjects。

您可以使用getJSONObject()getString()getFloat()代替get(),这样就无需强制转换结果。

public void parseJson() {
    JSONParser parser = new JSONParser();
    try
       {
           JSONObject jsonObject = new JSONParser().parse(new FileReader("output_nlu_sentiment.json"));
           JSONObject sentimentobject= null;
           JSONObject documentobject = null;

          sentimentobject=  jsonObject.getJSONObject("sentiment");
          documentobject=   sentimentobject.getJSONObject("document");

          String label =  documentobject.getString("label");
           float score =  documentobject.getFloat("score");
           String output = String.format("Label: %s Score: %f", label, score);
           System.out.println(output);

       }catch(FileNotFoundException fe){
           fe.printStackTrace();
       }catch(Exception e){
           e.printStackTrace();
       }
}

对于这类对象,属性名称也可以用作对象属性,我建议您看一下Gson库。在将JSON建模为POJO的组合之后,解析需要1行代码。