JSON - 检查数组是否存在

4
我有一个包含一些数组的JSON文件。我想知道是否有人知道如何检查文件中是否存在特定的数组。
编辑:这是我的文件组织方式。
           {
                   'Objects':
                    {
                             'array1':
                              [
                                         {
                                         'element1': 'value',
                                         'element1': 'value',                                                   
                                         'element1': 'value'
                                         }
                             ],
                             // more arrays. 
                   }

我希望能够搜索数组并检查特定的数组是否存在,如果存在,则将其序列化。 谢谢您提前的所有帮助。

文件内容的完整最小示例是什么? - Programmer Bruce
程序员布鲁斯:请查看我的更新问题。 - ErikssonE
目标数组应该如何选择?通过其包含对象中的元素名称吗? - Programmer Bruce
@程序员布鲁斯 - 根据其元素名称。 - ErikssonE
有任何特殊的性能问题吗?只反序列化整个JSON内容,然后确定数组是否存在是合理的吗?或者出于真正的性能考虑,您是否尝试仅反序列化具有目标数组的小部分JSON内容? - Programmer Bruce
@程序员布鲁斯:我没有任何性能方面的顾虑,我的文件并不是很大。对于我的情况来说,无论是在找到数组之前还是之后反序列化它都没有太大关系。 - ErikssonE
3个回答

4
以下是使用Jackson的示例方法。它使用最新的问题更新中呈现的相同JSON结构,以及匹配的Java数据结构。这使得反序列化非常容易,只需一行代码即可。
我选择将JSON数组仅反序列化为Java列表。很容易将其更改为使用Java数组。
(请注意,如果您可以控制它,建议更改此JSON结构存在问题。)
{
    "objects": {
        "array1": [
            {
                "element1": "value1",
                "element2": "value2",
                "element3": "value3"
            }
        ],
        "array2": [
            {
                "element1": "value1",
                "element2": "value2",
                "element3": "value3"
            }
        ],
        "array3": [
            {
                "element1": "value1",
                "element2": "value2",
                "element3": "value3"
            }
        ]
    }
}

Java 代码:

import java.io.File;
import java.util.List;
import java.util.Map;

import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
import org.codehaus.jackson.map.ObjectMapper;

public class Foo
{
  public static void main(String[] args) throws Exception
  {
    ObjectMapper mapper = new ObjectMapper();
    // configure Jackson to access non-public fields
    mapper.setVisibilityChecker(mapper.getVisibilityChecker().withFieldVisibility(Visibility.ANY));

    // deserialize JSON to instance of Thing
    Thing thing = mapper.readValue(new File("input.json"), Thing.class);

    // look for the target named array2
    if (thing.objects.containsKey("array2"))
    {
      // an element with the target name is present, make sure it's a list/array
      if (thing.objects.get("array2") instanceof List)
      {
        // found it
        List<OtherThing> target = thing.objects.get("array2");
        OtherThing otherThing = target.get(0);
        System.out.println(otherThing.element1); // value1
        System.out.println(otherThing.element2); // value2
        System.out.println(otherThing.element3); // value3
      }
      // else do something
    }
    // else do something
  }
}

class Thing
{
  Map<String, List<OtherThing>> objects;
}

class OtherThing
{
  String element1;
  String element2;
  String element3;
}

只想提一下。将数据反序列化为POJO非常棒,但流式解析器速度更快。如果你只需要检查数组中的某些值一次,那么流式处理可能更合适(虽然不那么棒)。 - Jon7
Jackson Databind 和 Jackson Streaming == 保时捷 v 法拉利 -- 它们都很棒,而且非常快,但是没错,其中一个更快。 - Programmer Bruce

1

所以你想要加载一个包含一些JSON数组的文件,并在这些数组中搜索某些内容?我建议使用一个好的JSON解析器,比如Jackson


是的!我想检查文件是否包含特定数组,如果包含错误,则将使用jsonserializer。 - ErikssonE

-1
你可以使用 "value instanceof Array"。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接