3

JSONファイルに次のような配列があります

{ "fields": [
        {
            "name": "order_id",
            "type": "INTEGER",
            "position": 0
        },
        {
            "name": "district_id",
            "type": "INTEGER",
            "position": 1
        }]
}

配列「フィールド」の内容を取得する際にツリーモデルを使用しています。コードは次のようになります..

public static void main(String[] args) throws JsonParseException, IOException {
File jsonFile = new File("metadata.json");
String theJsonString = jsonFile.toString();
String name = null;
String type =null;
int position = 0;
ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally
JsonNode rootNode = mapper.readTree(theJsonString);
JsonNode fields = rootNode.get("fields");
    if (fields != null) {

    for (int i = 0; i < fields.size(); i ++) {
        if(fields.has("name"))
            name = fields.get("name").getTextValue();
        if(fields.has("type"))
             type = fields.get("type").getTextValue();
        if(fields.has("position"))  
             position = fields.get("position").getIntValue();


        System.out.println(name);
    }
    }
  }

実行時に次のエラーが発生します::

Exception in thread "main" org.codehaus.jackson.JsonParseException: Unexpected character ('/' (code 47)): maybe a (non-standard) comment? (not recognized as one since Feature 'ALLOW_COMMENTS' not enabled for parser)
 at [Source: java.io.StringReader@3eed2cab; line: 1, column: 2]
    at org.codehaus.jackson.JsonParser._constructError(JsonParser.java:1432)
    at org.codehaus.jackson.impl.JsonParserMinimalBase._reportError(JsonParserMinimalBase.java:385)
    at org.codehaus.jackson.impl.JsonParserMinimalBase._reportUnexpectedChar(JsonParserMinimalBase.java:306)
    at org.codehaus.jackson.impl.ReaderBasedParser._skipComment(ReaderBasedParser.java:1498)
    at org.codehaus.jackson.impl.ReaderBasedParser._skipWSOrEnd(ReaderBasedParser.java:1474)
    at org.codehaus.jackson.impl.ReaderBasedParser.nextToken(ReaderBasedParser.java:362)
    at org.codehaus.jackson.map.ObjectMapper._initForReading(ObjectMapper.java:2761)
    at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2709)
    at org.codehaus.jackson.map.ObjectMapper.readTree(ObjectMapper.java:1533)
    at metadata.JSONParser.main(JSONParser.java:32)

JSON を使い始めたばかりなので、解決策が見つかりません。誰でもこれを解決するのを手伝ってもらえますか?

4

4 に答える 4

1

ファイルの内容が必要な場合、ファイルmetadata.jsonを呼び出しtoStringてもそれは得られません。代わりに、ファイル名へのパスを保持する文字列を提供します。

代わりに、次FileInputStreamFileようなものを作成します。

FileInputStream fis = new FileInputStream(jsonFile);

で使用できますmapper

JsonNode rootNode = mapper.readTree(fis);


fields.get(i)配列を反復処理して、配列に含まれるそれぞれにアクセスするとき に呼び出すこともできますJsonNode

于 2012-11-21T13:07:37.390 に答える
0

私は数日前に同じ問題を抱えていました。私の JSONには次の構文があります。

{ "boxes": [
  {
    "name": "redBox.png",
    "version": 15
  },
  {
    "name": "blueBox.png",
    "version": 9
  }
]
}

ボックスバージョンのPOJO クラスを返すメソッドを作成する必要がありました。私の解決策は次のとおりです。

private static List<DataVersion> receiveDataVersions() throws IOException
    {
        String path = System.getProperty( "user.dir" ) + File.separator +
                        "versions.json";
        List<DataVersion> versions = new ArrayList<>();
        JsonNode folder = null;
        try( InputStream stream = new FileInputStream( path ) )
        {
            folder = new ObjectMapper().readTree( stream );
        }
        JsonNode boxes = folder.get( "inst" );
        boxes.forEach( version -> versions.add( new DataVersion(
                        version.get( "name" ).getTextValue(),
                        version.get( "version" ).getIntValue() ) ) );
        return versions;
    }

POJOは次のとおりです。

public class DataVersion
{
    private String name;
    private int version;

    public DataVersion() {
    }

    public DataVersion(String name, int version) {
        this.name = name;
        this.version = version;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getVersion() {
        return version;
    }

    public void setVersion(int version){
        this.version=version;
    }


    @Override
    public String toString()
    {
        return "DataVersion [" + "name='" + name + '\'' + ", version=" +
                        version + ']';
    }
}
于 2016-09-17T21:29:51.863 に答える
0

私は同じ問題を抱えており、最終的にこのコードで JsonParser オブジェクトを取得することで問題を修正しました。

FileInputStream fis = new FileInputStream(path);
JsonParser jp = new JsonFactory().createParser(fis);
于 2014-02-14T09:15:10.823 に答える
-1

あなたのコードでこれを試してください

jsonFactory.enable(JsonParser.Feature.ALLOW_COMMENTS);
于 2012-11-21T14:48:03.510 に答える