Java 如何使用Camel和Jackson库将嵌套的键、值对打包成JSON?

Java 如何使用Camel和Jackson库将嵌套的键、值对打包成JSON?,java,json,spring,jackson,apache-camel,Java,Json,Spring,Jackson,Apache Camel,我有一个Java项目,它当前返回一个到Camel的映射,没有任何嵌套的键、值对,Jackson库使用Jackson库将其很好地编组为JSON 例如,如果我将以下两个关键值放入demoMap中: Map<String,String> demoMap = new TreeMap<String,String> demoMap.put("key1","5"); demoMap.put("key2","10"); 但是,现在我的一些键值条目将具有可选的可见性,我需要将其作为嵌套键

我有一个Java项目,它当前返回一个到Camel的映射,没有任何嵌套的键、值对,Jackson库使用Jackson库将其很好地编组为JSON

例如,如果我将以下两个关键值放入demoMap中:

Map<String,String> demoMap = new TreeMap<String,String>
demoMap.put("key1","5");
demoMap.put("key2","10");
但是,现在我的一些键值条目将具有可选的可见性,我需要将其作为嵌套键值放入映射中。没有可选可见性的任何键、值都将使用默认值。因此,例如,如果我为key1和key2指定可见性,而不是key3,我希望得到如下所示的JSON:

{"key1":"5",
 "key2":"10",
 "key3":"17",
 "visibility" : { "key1": "a&b&!c", "key2": "a&b", "_default": "a" }
}
如何让Camel使用嵌套的键、值对来处理Java对象?我是一个视觉学习者,所以一个简单的例子会很有帮助

我尝试将贴图更改为具有值作为对象,即:

Map<String,Object> demoMap = new TreeMap<String,Object>
所以我知道怎么不做-/

我在重新阅读了Camel JSON文档,但在撰写本文时,它没有指定具有嵌套键、值对的示例

更新:根据Tom的反馈,我创建了两张地图,即:

Map<String,String> keyvalues = new TreeMap<String,String>();
Map<String,String> visibility = new TreeMap<String,String>();
Map keyvalues=newtreemap();
地图可见性=新树映射();
这是我的类,我称之为SensorGenerator,它将属性文件加载到地图中:

package sample;

import java.util.Map;
import java.util.Properties;
import java.util.TreeMap;

import org.codehaus.jackson.annotate.JsonAnyGetter;
import org.codehaus.jackson.annotate.JsonProperty;

public class SensorGenerator {

    private Properties sourceProperties;

    // create a map of sensor keyvalues, and a map of sensor visibility
    Map<String,String> keyvalues = new TreeMap<String,String>();
    @JsonProperty
    Map<String,String> visibility = new TreeMap<String,String>();

    @JsonAnyGetter
    public Map<String, String> getKeyvalues() { 

        for (Object key : sourceProperties.keySet()) {

            // Separate out each of the field:datatype:visibility tuples as an entry in the
            // values array
            String[] values = sourceProperties.getProperty((String) key).split(
                    ",");
            // split the key between 'sensor' and the 'number' Ex: sensor1 -> sensor,1
            String[] keyArray = key.toString().split("(?<=([a-zA-Z]++))");
            String keyNumber = keyArray[1]; // grab the number to append for each sensor

            // define string buffer that appends sensor number for each sensor's
            // keys.  Ex: sensor1 would have s1make, s1makeDataType, etc.
            StringBuffer sensorNumberStringBuffer = new StringBuffer();
            sensorNumberStringBuffer.append("s");
            sensorNumberStringBuffer.append(keyNumber);

            // make, its data type, and visibility (with s# prefix)
            StringBuffer makeStringBuffer = new StringBuffer();
            makeStringBuffer.append(sensorNumberStringBuffer);
            makeStringBuffer.append("make");
            StringBuffer makeDataTypeStringBuffer = new StringBuffer();
            makeDataTypeStringBuffer.append(sensorNumberStringBuffer);
            makeDataTypeStringBuffer.append("makeDataType");
            StringBuffer makeVizStringBuffer = new StringBuffer();
            makeVizStringBuffer.append(sensorNumberStringBuffer);
            makeVizStringBuffer.append("makeViz");

            // model, its data type, and visibility (with s# prefix)
            StringBuffer modelStringBuffer = new StringBuffer();
            modelStringBuffer.append(sensorNumberStringBuffer);
            modelStringBuffer.append("model");
            StringBuffer modelDataTypeStringBuffer = new StringBuffer();
            modelDataTypeStringBuffer.append(sensorNumberStringBuffer);
            modelDataTypeStringBuffer.append("modelDataType");
            StringBuffer modelVizStringBuffer = new StringBuffer();
            modelVizStringBuffer.append(sensorNumberStringBuffer);
            modelVizStringBuffer.append("modelViz");

            // serialNumber, its data type, and visibility (with s# prefix)
            StringBuffer serialNumberStringBuffer = new StringBuffer();
            serialNumberStringBuffer.append(sensorNumberStringBuffer);
            serialNumberStringBuffer.append("serialNumber");
            StringBuffer serialNumberDataTypeStringBuffer = new StringBuffer();
            serialNumberDataTypeStringBuffer.append(sensorNumberStringBuffer);
            serialNumberDataTypeStringBuffer.append("serialNumberDataType");
            StringBuffer serialNumberVizStringBuffer = new StringBuffer();
            serialNumberVizStringBuffer.append(sensorNumberStringBuffer);
            serialNumberVizStringBuffer.append("serialNumberViz");

            // sensorType, its data type, and visibility (with s# prefix)
            StringBuffer sensorTypeStringBuffer = new StringBuffer();
            sensorTypeStringBuffer.append(sensorNumberStringBuffer);
            sensorTypeStringBuffer.append("sensorType");
            StringBuffer sensorTypeDataTypeStringBuffer = new StringBuffer();
            sensorTypeDataTypeStringBuffer.append(sensorNumberStringBuffer);
            sensorTypeDataTypeStringBuffer.append("sensorTypeDataType");
            StringBuffer sensorTypeVizStringBuffer = new StringBuffer();
            sensorTypeVizStringBuffer.append(sensorNumberStringBuffer);
            sensorTypeVizStringBuffer.append("sensorTypeViz");

            //  put all the field:datatype keyvalues for this sensor in the keyvalues map
            //  and visibilities in the visibility map

            // make, data type, and visibility
            keyvalues.put(makeStringBuffer.toString(), values[0].split(":")[0]);
            keyvalues.put(makeDataTypeStringBuffer.toString(), values[0].split(":")[1]);
            visibility.put(makeVizStringBuffer.toString(), values[0].split(":")[2]);

            // model, data type, and visibility
            keyvalues.put(modelStringBuffer.toString(), values[1].split(":")[0]);
            keyvalues.put(modelDataTypeStringBuffer.toString(), values[1].split(":")[1]);
            visibility.put(modelVizStringBuffer.toString(), values[1].split(":")[2]);

            // serialNumber, data type, and visibility
            keyvalues.put(serialNumberStringBuffer.toString(), values[2].split(":")[0]);
            keyvalues.put(serialNumberDataTypeStringBuffer.toString(), values[2].split(":")[1]);
            visibility.put(serialNumberVizStringBuffer.toString(), values[2].split(":")[2]);

            // sensorType, data type, and visibility
            keyvalues.put(sensorTypeStringBuffer.toString(), values[3].split(":")[0]);
            keyvalues.put(sensorTypeDataTypeStringBuffer.toString(), values[3].split(":")[1]);
            visibility.put(sensorTypeVizStringBuffer.toString(), values[3].split(":")[2]);

            // add in default visibility
            visibility.put("_default", "a");

        }
        return keyvalues;
    }

    public void setSourceProperties(Properties properties) {
        this.sourceProperties = properties;
    }

}
包装样品;
导入java.util.Map;
导入java.util.Properties;
导入java.util.TreeMap;
导入org.codehaus.jackson.annotate.JsonAnyGetter;
导入org.codehaus.jackson.annotate.JsonProperty;
公共类传感器发生器{
私有财产;
//创建传感器键值图和传感器可见性图
Map keyvalues=newtreemap();
@JsonProperty
地图可见性=新树映射();
@JsonAnyGetter
公共映射getKeyvalues(){
for(对象键:sourceProperties.keySet()){
//将每个字段:datatype:visibility元组作为
//值数组
String[]values=sourceProperties.getProperty((字符串)键).split(
",");
//将钥匙在“传感器”和“数字”之间分开,例如:传感器1->传感器,1

String[]keyArray=key.toString().split((?您的结构不仅仅是一个映射。它是两个序列化不同的映射。表示这一点的一种方法是:

public class Whatever{
  Map<String,String> keyvalues;
  Map<String,String> visibility;
}
要得到您想要的东西,请使用@JsonAnyGetter。类似这样的东西(可以使其更易于使用):

我今天一直在努力解决这个问题,你的问题激发了我的灵感,让它成为一个血腥的作品:D注释如下:


请参见此处的JUnit test:

Tom,感谢您提供的信息。我添加了您建议的代码,但当我运行程序时,我只看到JSON中的键值。出于某种原因,我没有看到嵌套的可见性字段。我将附加我的SensorGenerator.java类,可能我遗漏了一些内容:-)这是一个JUnit测试。这个测试对我有效。你使用的是什么版本的Jackson?我使用的是camel Jackson 2.12.1。我在pom.xml中有以下依赖项:org.apache.camel camel Jackson${camel},我在其中定义了${camel}在上面的2.12.1中,我刚刚注意到我使用了不同的库,您使用的是:import com.fasterxml.jackson.annotation.JsonAnyGetter;import com.fasterxml.jackson.annotation.JsonProperty;我使用的是import org.codehaus.jackson.annotate.JsonAnyGetter;import org.codehaus.jackson.annotation.Json属性;您是否在pom.xml中指定了com.fasterxml库?感谢您提供的信息。我在正在清理的pom.xml中发现了一些Jackson库冲突。
package sample;

import java.util.Map;
import java.util.Properties;
import java.util.TreeMap;

import org.codehaus.jackson.annotate.JsonAnyGetter;
import org.codehaus.jackson.annotate.JsonProperty;

public class SensorGenerator {

    private Properties sourceProperties;

    // create a map of sensor keyvalues, and a map of sensor visibility
    Map<String,String> keyvalues = new TreeMap<String,String>();
    @JsonProperty
    Map<String,String> visibility = new TreeMap<String,String>();

    @JsonAnyGetter
    public Map<String, String> getKeyvalues() { 

        for (Object key : sourceProperties.keySet()) {

            // Separate out each of the field:datatype:visibility tuples as an entry in the
            // values array
            String[] values = sourceProperties.getProperty((String) key).split(
                    ",");
            // split the key between 'sensor' and the 'number' Ex: sensor1 -> sensor,1
            String[] keyArray = key.toString().split("(?<=([a-zA-Z]++))");
            String keyNumber = keyArray[1]; // grab the number to append for each sensor

            // define string buffer that appends sensor number for each sensor's
            // keys.  Ex: sensor1 would have s1make, s1makeDataType, etc.
            StringBuffer sensorNumberStringBuffer = new StringBuffer();
            sensorNumberStringBuffer.append("s");
            sensorNumberStringBuffer.append(keyNumber);

            // make, its data type, and visibility (with s# prefix)
            StringBuffer makeStringBuffer = new StringBuffer();
            makeStringBuffer.append(sensorNumberStringBuffer);
            makeStringBuffer.append("make");
            StringBuffer makeDataTypeStringBuffer = new StringBuffer();
            makeDataTypeStringBuffer.append(sensorNumberStringBuffer);
            makeDataTypeStringBuffer.append("makeDataType");
            StringBuffer makeVizStringBuffer = new StringBuffer();
            makeVizStringBuffer.append(sensorNumberStringBuffer);
            makeVizStringBuffer.append("makeViz");

            // model, its data type, and visibility (with s# prefix)
            StringBuffer modelStringBuffer = new StringBuffer();
            modelStringBuffer.append(sensorNumberStringBuffer);
            modelStringBuffer.append("model");
            StringBuffer modelDataTypeStringBuffer = new StringBuffer();
            modelDataTypeStringBuffer.append(sensorNumberStringBuffer);
            modelDataTypeStringBuffer.append("modelDataType");
            StringBuffer modelVizStringBuffer = new StringBuffer();
            modelVizStringBuffer.append(sensorNumberStringBuffer);
            modelVizStringBuffer.append("modelViz");

            // serialNumber, its data type, and visibility (with s# prefix)
            StringBuffer serialNumberStringBuffer = new StringBuffer();
            serialNumberStringBuffer.append(sensorNumberStringBuffer);
            serialNumberStringBuffer.append("serialNumber");
            StringBuffer serialNumberDataTypeStringBuffer = new StringBuffer();
            serialNumberDataTypeStringBuffer.append(sensorNumberStringBuffer);
            serialNumberDataTypeStringBuffer.append("serialNumberDataType");
            StringBuffer serialNumberVizStringBuffer = new StringBuffer();
            serialNumberVizStringBuffer.append(sensorNumberStringBuffer);
            serialNumberVizStringBuffer.append("serialNumberViz");

            // sensorType, its data type, and visibility (with s# prefix)
            StringBuffer sensorTypeStringBuffer = new StringBuffer();
            sensorTypeStringBuffer.append(sensorNumberStringBuffer);
            sensorTypeStringBuffer.append("sensorType");
            StringBuffer sensorTypeDataTypeStringBuffer = new StringBuffer();
            sensorTypeDataTypeStringBuffer.append(sensorNumberStringBuffer);
            sensorTypeDataTypeStringBuffer.append("sensorTypeDataType");
            StringBuffer sensorTypeVizStringBuffer = new StringBuffer();
            sensorTypeVizStringBuffer.append(sensorNumberStringBuffer);
            sensorTypeVizStringBuffer.append("sensorTypeViz");

            //  put all the field:datatype keyvalues for this sensor in the keyvalues map
            //  and visibilities in the visibility map

            // make, data type, and visibility
            keyvalues.put(makeStringBuffer.toString(), values[0].split(":")[0]);
            keyvalues.put(makeDataTypeStringBuffer.toString(), values[0].split(":")[1]);
            visibility.put(makeVizStringBuffer.toString(), values[0].split(":")[2]);

            // model, data type, and visibility
            keyvalues.put(modelStringBuffer.toString(), values[1].split(":")[0]);
            keyvalues.put(modelDataTypeStringBuffer.toString(), values[1].split(":")[1]);
            visibility.put(modelVizStringBuffer.toString(), values[1].split(":")[2]);

            // serialNumber, data type, and visibility
            keyvalues.put(serialNumberStringBuffer.toString(), values[2].split(":")[0]);
            keyvalues.put(serialNumberDataTypeStringBuffer.toString(), values[2].split(":")[1]);
            visibility.put(serialNumberVizStringBuffer.toString(), values[2].split(":")[2]);

            // sensorType, data type, and visibility
            keyvalues.put(sensorTypeStringBuffer.toString(), values[3].split(":")[0]);
            keyvalues.put(sensorTypeDataTypeStringBuffer.toString(), values[3].split(":")[1]);
            visibility.put(sensorTypeVizStringBuffer.toString(), values[3].split(":")[2]);

            // add in default visibility
            visibility.put("_default", "a");

        }
        return keyvalues;
    }

    public void setSourceProperties(Properties properties) {
        this.sourceProperties = properties;
    }

}
public class Whatever{
  Map<String,String> keyvalues;
  Map<String,String> visibility;
}
{
 "keyvalues" : { "key1": "5", "key2": "10", "key3": "17"},
 "visibility" : { "key1": "a&b&!c", "key2": "a&b", "_default": "a" }
}
public class Whatever{
    Map<String,String> keyvalues = new TreeMap<String,String>();
    @JsonProperty
    Map<String,String> visibility = new TreeMap<String,String>();

    @JsonAnyGetter
    public Map<String, String> getKeyvalues() {
        return keyvalues;
    }
}
           {"visibility":{"key1":"a&b&!c","key2":"a&b"},"key1":"5","key2":"10"}