如何在自定义getter中序列化JSON对象?

时间:2018-11-09 14:56:08

标签: java json jackson

我想从类dismiss()中获取此json:

 class DualSelectionDialogFragment : DialogFragment() {
    private var input: AutoCompleteTextView? = null
    [...]

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        [...]
        val builder = AlertDialog.Builder(context!!)
        val content = activity?.layoutInflater?.inflate(R.layout.select_dual_mode, null)
        [...]
        input = content?.findViewById<AutoCompleteTextView>(R.id.dual_autocomplete_input)?.apply {
            setAdapter(ArrayAdapter(context, android.R.layout.simple_list_item_1, [...]))
            setOnItemClickListener { _, view, _, _ ->
                [...]
                hideKeyboard(context, this)
                dismiss()
            }
        }
        [...]
        builder.setView(content).setCustomTitle(title)
        return builder.create()
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        dialog.window.setSoftInputMode(
                WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE +
                WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
    }

    [...]

    fun hideKeyboard(context: Context, view: View) {
        (context.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager).hideSoftInputFromWindow(view.windowToken, 0)
    }
}

这是课程:

User

但是我有一个错误的json:

{
    "id" : "1234",
    "campaignId" : {
        "campaignId" : "whatever"
    }
}

如您所见,第一级CampaignId是字符串,而不是包含campaignId键的对象。

如何在不创建另一个POJO的情况下实现这一目标?

2 个答案:

答案 0 :(得分:2)

  

我想从User类中获取此json:...

     

“ campaignId”:{          “ campaignId”:“随便什么”

...

  

私有字符串campaignId;

这些东西根本不在一起。

如果您的要求是campaignId应该是嵌套结构(如地图),则相应地 model

换句话说:“ bean”中的类型应该不是String之外的其他类型。例如,一张地图。或者,也许是一些具有单个成员且是字符串的自写类。

对您的读者而言,其他任何事情都非常令人困惑。您的代码应传达您的意图。而且,作为字符串的字段不是地图。

这就像在说:“看这里,我可爱的猫”,实际上,你有一只狗,但是你强迫他穿上小猫服装,看起来像只猫。

答案 1 :(得分:-1)

我解决了返回Map而不是String的问题:

public Map<String, String> getCampaignId() {
    Map<String, String> c = new HashMap<>();
    c.put("campaignId", campaignId);
    return c;
}

这是可行的,但是如果有人知道如何使用杰克逊注释或其他更优雅的解决方案,我会接受。