ここに私の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)
これを解決するのを手伝って
実際に配列を記述する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
ブロックを保存します。
行を変更する必要があります
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>>() {});
代わりに、配列を避けたい場合。
JsonNode node = mapper.readValue("[{\"id\":\"value11\",\"name\": \"value12\",\"qty\":\"value13\"},"
System.out.println("id : "+node.findValues("id").get(0).asText());
これもトリックを行いました。
product
クラスには、パラメーターなしのコンストラクターが必要です。プライベートにできますが、ジャクソンにはコンストラクタが必要です。
補足事項として、クラス名にはPascalの大文字小文字を使用する必要があります。それはProduct
ではなくproduct
です。