Ich habe ein Problem beim Sortieren von zwei Komponenten und sehe nicht warum.Sortierung mit TreeMap und TreeSet nicht synchronisiert
erstelle ich eine SortedMap wie folgt aus:
private static SortedMap<String, String> getMapping(List<LdapMapping> mapping)
{
SortedMap<String, String> fieldMapping = new TreeMap<>();
for (LdapMapping map : mapping)
{
fieldMapping.put(map.getInternalField(), map.getLdapField());
}
return fieldMapping;
}
, die auch in der generierten JSON gut aussieht:
"head": [
"emailAddress",
"enabled",
"firstName",
"lastName",
"name"
],
danach verwende ich diese SortedMap einen zweiten Teil des JSON wie diese zu erstellen:
/**
* Gets the field values from only ldap.
*
* @param entry the entry
* @param mapping the mapping
* @return the field values
*/
private static Map<String, Boolean> getFieldValues(SearchResultEntry entry, Map<String, String> mapping)
{
SortedSet<String> keys = new TreeSet<>(mapping.keySet());
Map<String, Boolean> fields = new HashMap<>();
for (String key : keys)
{
String ldapField = mapping.get(key);
String ldapValue = entry.getAttributeValue(ldapField);
fields.put(ldapValue, Boolean.FALSE);
}
return fields;
}
ldapUser.setFields(getFieldValues(entry, fieldMapping));
ldapUser.setAction(IMPORT_STATUS_NEW);
der zweite Teil Ergebnis in das Objekt gesetzt bekommen
/**
* The Class LdapUserImpl.
*/
public class LdapUserImpl implements LdapUser
{
/** The Constant serialVersionUID. */
private static final long serialVersionUID = 1L;
/** The action. */
private String action;
/** The fields. */
private transient Map<String, Boolean> fields;
public LdapUserImpl()
{
/* nothing special needed */
}
/** {@inheritDoc} */
@Override
public String getAction()
{
return action;
}
/** {@inheritDoc} */
@Override
public Map<String, Boolean> getFields()
{
return fields;
}
/** {@inheritDoc} */
@Override
public void setAction(String action)
{
this.action = action;
}
/** {@inheritDoc} */
@Override
public void setFields(Map<String, Boolean> data)
{
this.fields = data;
}
}
dieser Teil des JSON sieht dann wie folgt aus:
"data": [
{
"action": "New User",
"fields": {
"emailAddress": false,
"lastName": false,
"firstName": false,
"enabled": false,
"name": false
}
},
{
"action": "New User",
"fields": {
"emailAddress": false,
"enabled": false,
"firstname": false,
"name": false,
"lastname": false
}
},
Wie Sie sehen können, sie nicht übereinstimmen, wie ich die Werte im zweiten Teil will mit der Reihenfolge der entsprechen ersten Teil des JSON wie folgt aus:
"head": [
"emailAddress",
"enabled",
"firstName",
"lastName",
"name"
],
"data": [
{
"action": "New User",
"fields": {
"emailAddress": false,
"enabled": false,
"firstname": false,
"lastname": false,
"name": false
}
},
{
"action": "New User",
"fields": {
"emailAddress": false,
"enabled": false,
"firstname": false,
"lastname": false,
"name": false
}
}]
Hinweis: natürlich ersetzte ich die realen Werte mit dem Feld, das ist angezeigt bekommen.
Wo ist das Problem mit dem Erstellen des zweiten Teils? Liegt es daran, dass ich das SortedSet nicht richtig in Kombination mit der SortedMap verwende?
Wie werden Sie JSON konvertieren? – slim
Verwendung der Standard-Konfiguration für Jackson – Nico
Ist es wegen der Verwendung von 'HashMap', die Reihenfolge der Elemente nicht beibehalten? Vielleicht versuchen Sie es mit einer 'LinkedHashMap' und sehen Sie, ob Sie das gleiche Ergebnis reproduzieren können –