2
{
    "files": {
        "f1.png": {
            "intext": "A",
            "inval": 0,
            "inbinary": false
        },
        "f2.png": {
            "intext": "A",
            "inval": 0,
            "inbinary": true
        }
    }
}

当 f1.png 值不固定时如何访问 inval 的值。即文件的名称可以是任何东西,它不知道所以我如何使用Java访问此JSON中各种文件的无效字段的值?

4

5 回答 5

6

请尝试以下代码,

import org.json.JSONException;
import org.json.JSONObject;
public static void main(String[] args) {
        String jsonString = "{\"files\": {\"f1.png\": {\"intext\": \"A\",\"inval\": 0,\"inbinary\": false}, \"f2.png\": {\"intext\": \"A\",\"inval\": 0,\"inbinary\": true}}}";
        try {
            JSONObject jsonObject =new JSONObject(jsonString);
            JSONObject jsonChildObject = (JSONObject)jsonObject.get("files");
            Iterator iterator  = jsonChildObject.keys();
            String key = null;
            while(iterator.hasNext()){
                key = (String)iterator.next();
                System.out.println("inval value: "+((JSONObject)jsonChildObject.get(key)).get("inval"));
            }
        }
        catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

希望它能解决你的问题

于 2013-06-12T10:42:12.497 回答
1

您可以使用 ObjectMapper。

首先创建一个类Image。

import lombok.Data;

@Data
public class Image {

    private String intext;
    private Integer inval;
    private Boolean inbinary;

}

并转换为地图

final ObjectMapper objectMapper = new ObjectMapper();
final String jsonString =
      "{\"files\": {\"f1.png\": {\"intext\": \"A\",\"inval\": 0,\"inbinary\": false}, \"f2.png\": {\"intext\": \"A\",\"inval\": 0,\"inbinary\": true}}}";
  final Map<String, Map<String, Image>> output =
      objectMapper.readValue(
          jsonString, new TypeReference<Map<String, Map<String, Image>>>() {});

谢谢。

于 2021-01-20T04:08:05.497 回答
1

您可以使用 JsonPath 库来访问子元素。 https://github.com/json-path/JsonPath

它可以很简单

List<String> names = JsonPath.read(json, "$.files.*);

经过一些修改。

于 2017-08-31T15:22:53.593 回答
0

使用JacksonJsonNode,您可以:

private static final ObjectReader READER = new ObjectMapper()
    .getReader;

// blah

// read the node
final JsonNode node = READER.readTree(fromWhatever);

// access the inner "files" member
final JsonNode filesNode = node.get("files");

访问内部对象。

然后走filesNode你会做的物体:

final Iterator<Map.Entry<String, JsonNode>> iterator = filesNode.fields();
Map.Entry<String, JsonNode> entry;
while (iterator.hasNext()) {
    entry = iterator.next();
    // the "inval" field is entry.getValue().get("inval")
}

如果您可以使用此项目,这将变得更加简单:

// or .fromFile(), .fromReader(), others
final JsonNode node = JsonLoader.fromString(whatever);

final Map<String, JsonNode> map = JacksonUtils.nodeToMap(node.get("files"));
// walk the map
于 2013-06-12T10:24:25.240 回答
0

对于嵌套数组类型,

{
"combo":    [
                {"field":"divisions"},
                {"field":"lob"}
]

下面的代码会有所帮助。

Iterator<?> keys = jsnObj.keys();

    while(keys.hasNext()) {
        String key = (String) keys.next();
        JSONArray list = (JSONArray) jsnObj.get(key);
        if(list==null || list.length()==0)
            return null;
        List<String> comboList = new ArrayList<String>();
        for(int i=0;i<list.length();i++){
            JSONObject jsonObject =  (JSONObject)list.get(i);
            if(jsonObject==null)
                continue;
            comboList.add((String)jsonObject.get("fields"));
        }
    }
于 2017-11-02T10:22:49.670 回答