2016-09-11 2 views
-1

У меня есть большой проект im, над которым работает, есть кусок кода, в котором я получаю 2 массива String из запроса HTTP-почты на моем сервере, используя весну и hibernate (формат json), когда я печатаю размер массивов, я получаю 1 взамен, но в то же время у меня есть (как я должен/хочу/ожидать) 2 элемента внутри него, поэтому, когда я перебираю массив с ожидаемой длиной Я получаю «массив из связанного исключения», и это действительно странно.Строка [] длина массива не равна фактическому количеству элементов внутри него

p.s. - эта проблема повторяется и в других местах, может быть, она имеет какое-то отношение к спячке/весне ?.

выход:

JSON:

{"deviceAddr":["0022C01504D3,0022C015050F"],"devicePass":["HOMI26,HOMI26"],"deviceCount":2,"version":"MU18"} 

Код:

public class AddBatchObject { 

    private String[] deviceAddr; 

    public String[] getDeviceAddr() { 
     return deviceAddr; 
    } 

    @Override 
    public String toString() { 
     String batch = ""; 
     if (deviceAddr != null){ 
      batch += "deviceAaddr - " + "size = " + deviceAddr.length + ", " 
      + Arrays.asList(deviceAddr).toString() + "\n"; 
     } 
     if (devicePass != null){ 
      batch += "devicePass - " + "size = " + devicePass.length + ", " + 
       Arrays.asList(devicePass).toString() + "\n"; 
     } 
     return batch; 
    } 

} 

контроллер Остальное:

@RequestMapping(value = "/add/mac",method = RequestMethod.POST, produces =  "application/json") 
public @ResponseBody Object addMac(@RequestBody AddBatchObject addBatchObject, HttpServletRequest request) throws AuthenticationException{ 
    LoggerUtils.getLogger().info("addMac"); 
    return AdminAddMac.adminAddMac(addBatchObject,request); 
} 

Редактировать: как jtahlborn и Joe ответил, что данные json были неверно: ["0022C01504D3,0022C015050F"] - это один массив элементов. a двухэлементный массив будет ["0022C01504D3", "0022C015050F"].

+1

Пожалуйста, пост [mcve] поведения. – Tunaki

+1

Я не могу воспроизвести это. – Sweeper

+2

попробуйте этот 'batch + =" '"+ deviceAddr [0] +"' ";' – jtahlborn

ответ

1

Выход правильный. Ваш JSON содержит одну строку с запятой в ней, а не две различные строки.

JSON вы, вероятно, хотите есть:

{"deviceAddr":["0022C01504D3","0022C015050F"],"devicePass":["HOMI26","HOMI26"],"deviceCount":2,"version":"MU18"} 
0

Строка json правильная json с 4 парами ключ-значение. Вы можете поместить его в файл data.txt

{ 
    "deviceAddr": ["0022C01504D3,0022C015050F"], 
    "devicePass": ["HOMI26,HOMI26"], 
    "deviceCount": 2, 
    "version": "MU18" 
} 

и читать его с jackson

import com.fasterxml.jackson.core.JsonFactory; 
import com.fasterxml.jackson.core.JsonParseException; 
import com.fasterxml.jackson.core.JsonParser; 
import com.fasterxml.jackson.databind.JsonNode; 
import com.fasterxml.jackson.databind.ObjectMapper; 

import java.io.File; 
import java.io.IOException; 
import java.util.Iterator; 
import java.util.Map; 

public class Main { 
    public static void main(String[] args) throws JsonParseException, IOException { 
     JsonFactory jsonFactory = new JsonFactory(); 
     JsonParser jp = jsonFactory.createJsonParser(new File("data.txt")); 
     jp.setCodec(new ObjectMapper()); 
     JsonNode jsonNode = jp.readValueAsTree(); 
     readJsonData(jsonNode); 
    } 
    static void readJsonData(JsonNode jsonNode) { 
     Iterator<Map.Entry<String, JsonNode>> ite = jsonNode.fields(); 
     while(ite.hasNext()){ 
      Map.Entry<String, JsonNode> entry = ite.next(); 
      if(entry.getValue().isObject()) { 
       readJsonData(entry.getValue()); 
      } else { 
       System.out.println("key:"+entry.getKey()+", value:"+entry.getValue()); 
      } 
     } 
    } 
} 

выход

key:deviceAddr, value:["0022C01504D3,0022C015050F"] 
key:devicePass, value:["HOMI26,HOMI26"] 
key:deviceCount, value:2 
key:version, value:"MU18" 

Я надеюсь, что это поможет.

Смежные вопросы