web-dev-qa-db-ja.com

jacksonデシリアライゼーションjsonからJavaオブジェクト

ここに私のJava逆シリアル化に使用されるコード、json文字列をJavaオブジェクトに変換しようとしています。そうすることで、次のコード:

package ex1jackson;
import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import Java.io.IOException;
public class Ex1jackson {
public static void main(String[] args) {
   ObjectMapper mapper = new ObjectMapper();
try {
        String userDataJSON = "[{\"id\":\"value11\",\"name\": \"value12\",\"qty\":\"value13\"},"
                              + "{\"id\": \"value21\",\"name\":\"value22\",\"qty\": \"value23\"}]";
        product userFromJSON = mapper.readValue(userDataJSON, product.class);
        System.out.println(userFromJSON);
    } catch (JsonGenerationException e) {
        System.out.println(e);
        } catch (JsonMappingException e) {
       System.out.println(e);
    } catch (IOException e) {
    System.out.println(e);
    } 
}
}

そして私のproduct.Javaクラス

package ex1jackson;
public class product 
{
private String id;
private String name; 
private String qty; 

@Override
public String toString() {
    return "Product [id=" + id+ ", name= " + name+",qty="+qty+"]";
}
}

次のエラーが表示されます。

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: 
Unrecognized field "id" (class ex1jackson.product), not marked as ignorable (0 known properties: ]) at 
[Source: Java.io.StringReader@16f76a8; line: 1, column: 8] (through reference chain: ex1jackson.product["id"]) 
BUILD SUCCESSFUL (total time: 0 seconds)

これを解決するのを手伝って

27
MAHI

実際に配列を記述するJSONからオブジェクトを読み取ろうとしているようです。 Javaオブジェクトは中括弧_{}_でJSONオブジェクトにマップされますが、JSONは実際には配列を指定する角括弧_[]_で始まります。

あなたが実際に持っているのは_List<product>_です。Javaの型消去のためにジェネリック型を記述するには、TypeReferenceを使用する必要があります。逆シリアル化は次のようになります:myProduct = objectMapper.readValue(productJson, new TypeReference<List<product>>() {});

その他の注意事項:クラスは常にCamelCasedにする必要があります。あなたのメインメソッドはpublic static void main(String[] args) throws Exceptionであり、これはすべての無駄なcatchブロックを保存します。

37

行を変更する必要があります

product userFromJSON = mapper.readValue(userDataJSON, product.class);

product[] userFromJSON = mapper.readValue(userDataJSON, product[].class);

配列を逆シリアル化しているためです(ところで、前述のようにクラス名は大文字で始める必要があります)。さらに、これを機能させるには、フィールドのセッターメソッドを作成するか、パブリックとしてマークする必要があります。

編集:Steven Schlanskerの提案と使用も可能です

List<product> userFromJSON =
        mapper.readValue(userDataJSON, new TypeReference<List<product>>() {});

代わりに、配列を避けたい場合。

17
nutlike
 JsonNode node = mapper.readValue("[{\"id\":\"value11\",\"name\": \"value12\",\"qty\":\"value13\"},"

 System.out.println("id : "+node.findValues("id").get(0).asText());

これもトリックを行いました。

6
MAHI

productクラスには、パラメーターなしのコンストラクターが必要です。プライベートにできますが、ジャクソンにはコンストラクタが必要です。

補足事項として、クラス名にはPascalの大文字小文字を使用する必要があります。それはProductではなくproductです。

2
Esteban Araya