【问题标题】:Jackson, can it handle two nested random keys?杰克逊,它可以处理两个嵌套的随机键吗?
【发布时间】:2016-05-19 10:31:17
【问题描述】:

杰克逊有可能处理以下 JSON 结构吗?因为我真的不知道如何创建我的 POJO 类。一直在尝试使用hashmaps等方式,但没有结果。

我的 JSON 结构:

  {
          "waypoints" : {
            "-KH9UAPH5NmLJExaUa5g" : {
              "-KH9UAPH5NmLJExaS2s" : {
                "latitude" : 111,
                "longitude" : 111.1
              }
            },
            "-KHB1VjqUdO90vxj9XCh" : {
              "-KHB1VjqUdO90vxj9XCi" : {
                "latitude" : 222.1,
                "longitude" : 222.11
              },
              "-KHB1ZykbwgXM9sPNie9" : {
                "latitude" : 222.2,
                "longitude" : 222.22
              }
            }
          }
        },

更新

内键应包含以下内容

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;


@JsonIgnoreProperties(ignoreUnknown = true)
public class MyWaypoint {

    @JsonProperty("latitude")
    private double latitude;
    @JsonProperty("longitude")
    private double longitude;


    public MyWaypoint() {
    }

    public MyWaypoint(double latitude, double longitude) {
        this.latitude = latitude;
        this.longitude = longitude;
    }

    public double getLatitude() {
        return latitude;
    }
    public double getLongitude() {
        return longitude;
    }
}

代码更新

它在populateViewHolder 中的recyclerView 内,它将为数据库中的每个项目循环。就我而言,我希望它适用于航点中的每个项目(键)。

MyWaypoints 是本例中的 POJO 条目。

  private Firebase mRef;
    private Firebase mUserRef;
    private String mUserId;



    FirebaseRecyclerAdapter<MyWaypoints, LatLngViewHolderBack2> mAdapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

      mRef = new Firebase(Constants.FIREBASE_URL);
            if (mRef.getAuth() == null) {
                loadLoginView();
            }


        try {
            mUserId = mRef.getAuth().getUid();
        } catch (Exception e) {
            loadLoginView();
        }


        final RecyclerView mRecyclerView = (RecyclerView) findViewById(R.id.card_recycler_view);
        mRecyclerView.setHasFixedSize(false);
        LinearLayoutManager manager = new LinearLayoutManager(this);
        manager.setReverseLayout(false);
        mRecyclerView.setLayoutManager(manager);


        // https://todoapprj.firebaseio.com/users/1a96a633-7e67-41b8-9aa7-c70d4b7eb59c
        final String userUrl = Constants.FIREBASE_URL + "/users/" + mUserId + "/waypoints";
        mUserRef = new Firebase(userUrl);


        mAdapter = new FirebaseRecyclerAdapter<MyWaypoints, LatLngViewHolderBack2>(MyWayoints.class, R.layout.list_item, LatLngViewHolderBack2.class, mUserRef) {
            @Override
            protected void populateViewHolder(LatLngViewHolderBack2 latLngViewHolder, MyWaypoints item, int i) {



                // This will only acces the first key, where there is no latitudes or longitudes.
              //  String lon = item.getLongitude() + "";
              //  latLngViewHolder.locationA.setText(lon);

                // Random KEY1
                // ---> I'M HERE NOW <---
                //       Random KEY2
                //  ***Want to be here<***


    /********** Is it here i should put the JsonParse? **********/


            }
        };

        mRecyclerView.setAdapter(mAdapter);

    }

当前日志

这是我弄错了:

05-19 07:31:45.515 11345-11399/com.example.rasmusjosefsson.rjcar I/OpenGLRenderer: Initialized EGL, version 1.4
05-19 07:31:49.281 11345-11345/com.example.rasmusjosefsson.rjcar I/dynamic keys: -KH9UAPH5NmLJExaUa5g
05-19 07:31:49.281 11345-11345/com.example.rasmusjosefsson.rjcar I/LOG LONG: 111.1 
05-19 07:31:49.281 11345-11345/com.example.rasmusjosefsson.rjcar I/dynamic keys: -KHB1VjqUdO90vxj9XCh
05-19 07:31:49.282 11345-11345/com.example.rasmusjosefsson.rjcar I/LOG LONG: 222.11 
05-19 07:31:49.282 11345-11345/com.example.rasmusjosefsson.rjcar I/LOG LONG: 222.22

【问题讨论】:

    标签: android json jackson


    【解决方案1】:

    所以在澄清之后(在 cmets 内) - 请找到我的更新答案。

    解决方案的关键在于使用keys() 迭代器来迭代所有属性。

    private void parseJson() throws JSONException {
        String data = "{\n" +
                "      \"users\" : {" +
                "        \"0057242b-81e2-4f97-bca7-b671212614ba\" : {" +
                "          \"email\" : \"kalle@hotmail.se\"," +
                "          \"waypoints\" : {" +
                "            \"-KH9UAPH5NmLJExaUa5g\" : {" +
                "              \"-KH9UAPH5NmLJExaS2s\" : {" +
                "                \"latitude\" : 111," +
                "                \"longitude\" : 111.1" +
                "              }" +
                "            }," +
                "            \"-KHB1VjqUdO90vxj9XCh\" : {" +
                "              \"-KHB1VjqUdO90vxj9XCi\" : {" +
                "                \"latitude\" : 222.1," +
                "                \"longitude\" : 222.11" +
                "              }," +
                "              \"-KHB1ZykbwgXM9sPNie9\" : {" +
                "                \"latitude\" : 222.2," +
                "                \"longitude\" : 222.22" +
                "              }" +
                "            }" +
                "          }" +
                "        }}}";
    
        JSONObject response = new JSONObject(data);
        JSONObject users = response.getJSONObject("users");
        JSONObject guid = users.getJSONObject("0057242b-81e2-4f97-bca7-b671212614ba");
        JSONObject waypoint = guid.getJSONObject("waypoints");
    
        Iterator keys = waypoint.keys();
        while(keys.hasNext()) {
            // loop to get the dynamic keys
            String currentDynamicKey = (String)keys.next();
            Log.i("dynamic keys", currentDynamicKey);
            JSONObject obj = waypoint.getJSONObject(currentDynamicKey);
            Iterator key = obj.keys();
            while(key.hasNext()) {
                // loop to get the dynamic keys
                String currentDynamicKey2 = (String)key.next();
                JSONObject longlat = obj.getJSONObject(currentDynamicKey2);
                String lat = longlat.getString("latitude");
                String lng = longlat.getString("longitude");
            }
        }
    }
    

    上述 JSON 的我的 logcat 输出:

    05-19 15:39:37.676 6324-6324/ronin.fansboy I/dynamic keys: -KH9UAPH5NmLJExaUa5g 
    05-19 15:39:37.676 6324-6324/ronin.fansboy I/lat: 111 
    05-19 15:39:37.687 6324-6324/ronin.fansboy I/lng: 111.1 
    05-19 15:39:37.697 6324-6324/ronin.fansboy I/dynamic keys: -KHB1VjqUdO90vxj9XCh 
    05-19 15:39:37.697 6324-6324/ronin.fansboy I/lat: 222.1 
    05-19 15:39:37.707 6324-6324/ronin.fansboy I/lng: 222.11 
    05-19 15:39:37.717 6324-6324/ronin.fansboy I/lat: 222.2 
    05-19 15:39:37.727 6324-6324/ronin.fansboy I/lng: 222.22 
    

    【讨论】:

    • 是的,我知道,但这只会为我事先知道的密钥生成,而不是会添加的新随机密钥
    • 哦,我明白了,所以你的意思是航点是动态添加的,而你事先不知道键的名称是什么?
    • 每个外部随机ID(取自数据库)将显示为列表中的一个项目。但是如何手动解析呢?
    • 将尽快更新我的答案,为您提供解决方案。
    • 让它工作的最后一个问题 我应该在哪里使用我的代码?在 pojo 或活动中?如果你可以看一下,我更新了我使用它的代码。
    【解决方案2】:

    您可以使用此link 从 json 创建 POJO。可以选择设置其他属性(它是一个列表)。

    【讨论】:

      猜你喜欢
      • 2017-04-20
      • 2015-02-04
      • 1970-01-01
      • 2012-09-13
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2016-01-14
      • 2015-01-24
      相关资源
      最近更新 更多