
[code]

    public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState){
    
    
            ObjectMapper mapper = new ObjectMapper();
            try {
    
                JackSon response = mapper.readValue(
    
    
                 new URL("http://express.heartrails.com/api/json?method=getAreas"),
                        JackSon.class);
                String m = response.get("response").get(0).get("area").asText();
    
                super.onCreate(savedInstanceState);
    
                setContentView(R.layout.activity_main);
    
                TextView textView = (TextView) findViewById(R.id.text_view);
    
                textView.setText(String.valueOf(m));
    
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    }
    
[/code]

上記のコードでは、`response.get`のgetに`Cannot resolve method
'get(java.lang.String)'`と言うエラーが出ています。

[code]

    @Data
    public class JackSon {
        private Area response;
    
        @Data
        public class Area {
            private String[] area;
        }
    }
    
[/code]

このコードをどうようにすれば表示されるようになりますか？

[code]

    [
      {
        "a": "xxx",
        "b": yyy
      },
      {
        "a": "xxxx",
        "b": yyyy
      },
      {
        "a": "xx",
        "b": yy
      }
    ]
    
[/code]

上記のURLではなくこのような形のJSONデータを表示する場合どのように変えればよいですか？


CC BY-SA 3.0
2017-03-20T07:56:29.807
33419
2018-12-12T01:34:02.143
2017-08-04T12:30:52.220
13199
21127
question
java android-studio json jackson
Android StudioでのJacksonでのJsonデータ表示について


JavaBeanクラス`JackSon`:

[code]

    import com.fasterxml.jackson.annotation.JsonProperty;
    
    import java.util.List;
    
    public class JackSon {
    
        @JsonProperty("response")
        private Response response;
    
        public void setResponse(Response response) {
            this.response = response;
        }
    
        public Response getResponse() {
            return response;
        }
    
    
        public static class Response {
    
            @JsonProperty("area")
            private List<String> area;
    
            public void setArea(List<String> area) {
                this.area = area;
            }
    
            public List<String> getArea() {
                return area;
            }
    
        }
    }
    
[/code]

* * *
[code]

    public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState){
            ObjectMapper mapper = new ObjectMapper();
            JackSon response = null;
            try {
                response = mapper.readValue( new URL("http://express.heartrails.com/api/json?method=getAreas"), JackSon.class);
    
            final List<String> area = response.getResponse().getArea();
            final String s = area.toString();
                super.onCreate(savedInstanceState);
    
                setContentView(R.layout.activity_main);
    
                TextView textView = (TextView) findViewById(R.id.text_view);
    
                textView.setText(String.valueOf(m));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
[/code]


CC BY-SA 3.0
2017-08-04T13:17:42.807
36950
2017-08-04T13:24:16.917
2017-08-04T13:24:16.917
8888
8888
33419
answer


> 上記のコードでは、`response.get`のgetに`Cannot resolve method
> 'get(java.lang.String)'`と言うエラーが出ています。

`@Data`は[Lombokのアノテーション](https://projectlombok.org/features/Data)だと思いますので、自動でgetterが生成されています。従ってareaデータを取得するコードは

[code]

    response.getResponse().getArea();
    
[/code]

となります。  
(なお、質問とは直接関係ないですが、`Area`クラスを非staticな内部クラスとして定義する必要は無いですし、一般的にはそのようにすべきではないです。)

* * *

> 上記のURLではなくこのような形のJSONデータを表示する場合どのように変えればよいですか？

トップレベルが`[]`なJSONの変換については、配列に変換するかリストに変換するかでやり方が変わります。

[code]

    @Data
    class MyData {
        private String a;
        private int b;
    }
    
[/code]

というように定義したクラスに対して:

a)配列に変換する場合

[code]

    MyData[] myDataArray = mapper.readValue(..., MyData[].class);
    
[/code]

b)リストに変換する場合

[code]

    List<MyData> myDataList = mapper.readValue(..., new TypeReference<List<MyData>>(){});
    
[/code]

(ただし、リストへ変換したい場合でも、`TypeReference`を使用せず、一旦前者の方法で配列に変換した後それをリストへ変換したほうが速いそうです。下記参考リンク参照。)

参考:

  * [How to use Jackson to deserialise an array of objects - Stack Overflow](https://stackoverflow.com/a/6349488/4506703)


CC BY-SA 4.0
2018-12-12T01:28:36.747
51128
2018-12-12T01:34:02.143
2018-12-12T01:34:02.143
2808
2808
33419
answer