json失败了java对象

时间:2013-10-01 17:27:50

标签: java json

以下代码不起作用。无法将JSON转换为JAVA对象。 怎么解决?感谢。

import com.google.gson.Gson;

public class Rest{
    public static void main(String[] args) {
        String json = "{'CBE_GetNewSessionResponse': {'CBE_GetNewSessionResult': '10016-300-0000022151'}}";
        Gson gson = new Gson();
        Data data = gson.fromJson(json, Data.class);
        System.out.println(data.getResponse());
    }
}

class Data {
    private CBE_GetNewSessionResponse response;

    public CBE_GetNewSessionResponse getResponse() {
        return response;
    }

    public void setResponse(CBE_GetNewSessionResponse response) {
        this.response = response;
    }

    class CBE_GetNewSessionResponse{

        private String  CBE_GetNewSessionResult;

        public String getCBE_GetNewSessionResult() {
            return CBE_GetNewSessionResult;
        }

        public void setCBE_GetNewSessionResult(String cBE_GetNewSessionResult) {
            CBE_GetNewSessionResult = cBE_GetNewSessionResult;
        }


    }
}

2 个答案:

答案 0 :(得分:1)

The Gson docs state

  

使用字段与getter来表示Json元素

     

一些Json库使用类型的getter来推导出Json   元素。 我们选择使用所有字段(在继承层次结构中)   不是瞬态的,静态的或合成的。我们这样做是因为没有   所有课程都使用适当命名的getter编写。而且,getXXX   或isXXX可能是语义而不是指示属性。

换句话说,您的字段需要按照JSON中的显示进行命名,反之亦然。

private CBE_GetNewSessionResponse CBE_GetNewSessionResponse;

然后它会将您的JSON正确映射到您的对象结构。

答案 1 :(得分:0)

您在数据response中命名了字段,而在JSon中将其命名为CBE_GetNewSessionResponse。也许这样尝试

public class Rest{
    public static void main(String[] args) {
        String json = "{'CBE_GetNewSessionResponse': {" +
                "'CBE_GetNewSessionResult': '10016-300-0000022151'}" +
                "}";
        Gson gson = new Gson();
        Data data = gson.fromJson(json, Data.class);
        System.out.println(data.getCBE_GetNewSessionResponse().getCBE_GetNewSessionResult());
    }
}

class Data {
    private CBE_GetNewSessionResponse CBE_GetNewSessionResponse;

    public CBE_GetNewSessionResponse getResponse() {
        return CBE_GetNewSessionResponse;
    }

    public void setResponse(CBE_GetNewSessionResponse response) {
        this.CBE_GetNewSessionResponse = response;
    }

    class CBE_GetNewSessionResponse{

        private String  CBE_GetNewSessionResult;

        public String getCBE_GetNewSessionResult() {
            return CBE_GetNewSessionResult;
        }

        public void setCBE_GetNewSessionResult(String cBE_GetNewSessionResult) {
            CBE_GetNewSessionResult = cBE_GetNewSessionResult;
        }
    }
}

如果您想在Data类字段和JSon键中使用不同的名称,则需要实现自己的FieldNamingStrategy

class MyNameStrategy implements FieldNamingStrategy {

    @Override
    public String translateName(Field f) {
        if (f.getName().equals("response")) {
            return "CBE_GetNewSessionResponse";
        } else {
            return f.getName();
        }
    }
}

并在创建Gson对象

时使用它
Gson gson = new GsonBuilder().setFieldNamingStrategy(new MyNameStrategy()).create();