2013-02-15 13 views
22

ここでは、デシリアライゼーションに使用されるJavaコードです。 jsonの文字列をjavaオブジェクトに変換しようとしています。jacksonデシリアライゼーションjson to java-objects

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: [email protected]; line: 1, column: 8] (through reference chain: ex1jackson.product["id"]) 
BUILD SUCCESSFUL (total time: 0 seconds) 

あなたproductクラスはパラメータなしのコンストラクタを必要と

答えて

29

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

あなたが実際に持っているものはList<product>です。ジェネリック型を記述するには、Javaのタイプ消去のためにTypeReferenceを使用する必要があります。あなたの非直列化は次のように読むことができます:myProduct = objectMapper.readValue(productJson, new TypeReference<List<product>>() {});

あなたのクラスは常にCamelCaseでなければなりません。あなたの主な方法はちょうどpublic static void main(String[] args) throws Exceptionになることがあり、それはあなたにすべて役に立たないcatchブロックを保存します。

2

、これを解決するために私を助けて。プライベートにすることはできますが、Jacksonはコンストラクタを必要とします。

注:クラス名にはパスカルケーシングを使用する必要があります。それはProductであり、productではありません。

+0

@ Esteban Arayaこれを試しましたが、同じエラーが発生しています – MAHI

11

あなたは(ところで:先に述べたように、あなたは大文字を使用してクラス名を開始する必要があります)配列をデシリアライズしているので、ラインに

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

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

を変更する必要があります。さらに、フィールドのセッターメソッドを作成するか、またはこのフィールドをpublicとしてマークする必要があります。

編集:あなたはまた、スティーブンSchlanskerの提案で行くと、あなたは配列を避けたい場合は代わりに

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

を使用することができます。

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

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

これもやっています。