29

これは、逆シリアル化に使用される私の 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)

これを解決するのを手伝ってください、

4

4 に答える 4

39

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

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

その他の注意事項: クラスは常に PascalCased にする必要があります。あなたの主な方法は、役に立たないブロックpublic static void main(String[] args) throws Exceptionをすべて節約することです。catch

于 2013-02-15T08:33:23.643 に答える
17

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

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>>() {});

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

于 2013-02-15T09:07:22.420 に答える
6
 JsonNode node = mapper.readValue("[{\"id\":\"value11\",\"name\": \"value12\",\"qty\":\"value13\"},"

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

これもうまくいきました。

于 2013-02-15T09:45:10.147 に答える
2

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

補足として、クラス名には Pascal の大文字小文字を使用する必要があります。つまりProduct、そうではありませんproduct

于 2013-02-15T07:41:36.110 に答える