JSON, соответствующий XML с атрибутами? - PullRequest
29 голосов
/ 30 октября 2010

Я разрабатываю API для моего веб-приложения.

Я думал о поддержке только ответов JSON (не XML), потому что они более упорядочены.

Но я только что столкнулся с этим XML:1005 *

<folders>
    <folder id="123" private="0" archived="0" order="1">Shopping</folder>
</folders>

и мне было интересно, каким будет соответствующий JSON.У меня такое ощущение, что в этом случае XML будет более компактным.

Спасибо, Дэн

Ответы [ 14 ]

0 голосов
/ 05 мая 2017

Я столкнулся со сценарием, который требует как XML, так и JSON для ввода и вывода на основе того, что было передано. Я нашел способ, который работает с атрибутами XML / свойствами и JSON. Теперь обратите внимание, это то, как это закодировано в Java, заставляет это работать таким образом.

Мой пример XML:

<Log>
    <datetime>05/05/2017 13:45:22</datetime>
    <sessionid>2da236d2-3852-4a09-8067-198193d2828b</sessionid>
    <message msgType="Debug">This is my message</message>
</Log>

Мой пример JSON:

{
    "datetime":"05/05/2017 13:45:22",
    "sessionid":"2da236d2-3852-4a09-8067-198193d2828b",
    "message": {
        "content":"This is a testa",
        "msgType":"Debug"
    }
}

Как я заставил это работать через код Log.java :

package log;

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;

@JacksonXmlRootElement(localName = "Log")
public class Log {
    @JacksonXmlProperty(localName = "datetime")
    private String datetime;
    @JacksonXmlProperty(localName = "sessionid")
    private String sessionid;
    @JacksonXmlProperty(localName = "message")
    private Message message;

    public Log() {
        this.sessionid = "0";
        this.datetime = "";
        this.message = new Message();
    }

    public String getDatetime() {
        return datetime;
    }

    public void setDatetime(String datetime) {
        this.datetime = datetime;
    }

    public String getSessionid() {
        return sessionid;
    }

    public void setSessionid(String sessionid) {
        this.sessionid = sessionid;
    }

    public Message getMessage() {
        return message;
    }

    public void setMessage(Message message) {
        this.message = message;
    }
}

Message.java , обратите внимание на текст @JacksonXmlText ниже, который является ключевым:

package log;

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlText;

public class Message {
    @JacksonXmlProperty(localName = "msgType", isAttribute = true)
    private String msgType;
    @JacksonXmlText
    private String content;

    public Message() {
        this.content = "";
    }

    public String getMsgType() {
        return msgType;
    }

    public void setMsgType(String msgType) {
        switch(msgType.toLowerCase())
        {
        case "test":
        case "debug":
        case "warn":
        case "error":
            break;
        default:
            msgType = "Unknown";
            break;
        }

        this.msgType = msgType;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

Звонящий в LogController.java :

..
@RequestMapping(value = "/Logger", produces={"application/xml", "application/json"}, consumes={"application/xml", "application/json"})
public ResponseEntity<String> Logger(@RequestBody String logInfo, @RequestHeader("Content-Type") String contentType) {
    try 
    {
        String xml = "";
        Log logObj = null; 
        HttpHeaders responseHeaders = new HttpHeaders();
        responseHeaders.add("Content-Type", contentType);

        if (contentType.toLowerCase().contains("json"))
        {
           ObjectMapper mapper = new ObjectMapper();
           logObj = mapper.readValue(logInfo, Log.class);
           xml = mapper.writeValueAsString(logObj);
        }
        else if (contentType.toLowerCase().contains("xml"))
        {
           XmlMapper xmlMapper = new XmlMapper();
           logObj = xmlMapper.readValue(logInfo, Log.class);
           xml = xmlMapper.writeValueAsString(logObj);
        }
        else
           return new ResponseEntity<String>(HttpStatus.BAD_REQUEST);

        //TODO GWL
        //Save Log data, via Async Web Service, Data, or System 
        return new ResponseEntity<String>(xml, responseHeaders, HttpStatus.OK);
    } 
    catch( Exception ex)
    {
        ex.printStackTrace();
        return new ResponseEntity<String>(HttpStatus.BAD_REQUEST);
    }
}
0 голосов
/ 23 марта 2017

«content» используется для фактического текста, в то время как атрибуты являются его братьями и сестрами в полученном JSON:

{ "folders":
 { "folder":
  {
   "archived":0,
   "private":0,
   "id":123,
   "content":"Shopping",
   "order":1
  }
 }
}

Подробности реализации Java

0 голосов
/ 30 октября 2010

JSON более однороден, чем XML, и не различает текстовые атрибуты и иерархическое содержимое.Для вашего примера естественным представлением будет

[
  {"id": 123, "private": 0, "archived": 0, "order": 1, "name": "Shopping"}
]

. Это все же более компактно, чем соответствующий XML.

0 голосов
/ 30 октября 2010

За исключением имен атрибутов, которые всегда имеют одинаковую длину, JSON всегда будет более компактным, поскольку просто не имеет закрывающих тегов;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...