Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ObjectMapper-Java对象的JSON字符串不工作_Java_Json_Api_Object Object Mapping - Fatal编程技术网

ObjectMapper-Java对象的JSON字符串不工作

ObjectMapper-Java对象的JSON字符串不工作,java,json,api,object-object-mapping,Java,Json,Api,Object Object Mapping,我有一个需求,需要从API转换JSON响应,并将其作为XML发送到最终客户机 我能够成功地从API接收JSON(下面粘贴的输出),但无法使用ObjectMapper将其转换为Java对象。我没有得到任何错误;但当我返回“GetCardInfo”对象时,它是空的 我曾尝试在谷歌上搜索,但找不到它不起作用的原因。如果有人能帮助我理解我的代码有什么问题,这将是一个很大的帮助 import java.io.IOException; import java.io.StringReader; import

我有一个需求,需要从API转换JSON响应,并将其作为XML发送到最终客户机

我能够成功地从API接收JSON(下面粘贴的输出),但无法使用ObjectMapper将其转换为Java对象。我没有得到任何错误;但当我返回“GetCardInfo”对象时,它是空的

我曾尝试在谷歌上搜索,但找不到它不起作用的原因。如果有人能帮助我理解我的代码有什么问题,这将是一个很大的帮助

import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import java.lang.Object;

import javax.annotation.Resource;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.ws.Response;

import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpStatus;
import org.json.JSONObject;
import org.json.XML;
import org.slf4j.ext.XLogger;
import org.slf4j.ext.XLoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;

import com.bhn.webservice.ivr.CardActivationResponse;
import com.bhn.webservice.ivr.CardInfo;
import com.bhn.webservice.ivr.ErrorDetails;
import com.bhn.webservice.ivr.GetCardInfo;
import com.bhn.webservice.ivr.GetCardInfoReceiveJSONResponse;
import com.bhn.webservice.ivr.GetCardInfoRequest;
import com.bhn.webservice.ivr.GetCardInfoResponse;
import com.bhn.webservice.ivr.GetCardInfoSendJSONRequest;
import com.bhn.webservice.ivr.GetCardTransactionsReceiveJSONResponse;
import com.bhn.webservice.ivr.GetCardTransactionsRequest;
import com.bhn.webservice.ivr.GetCardTransactionsResponse;
import com.bhn.webservice.ivr.GetCardTransactionsSendJSONRequest;
import com.bhn.webservice.ivr.IVRKPNResponse;
import com.bhn.webservice.ivr.IVRResponse;
import com.bhn.webservice.ivr.IVRWrapperConstants;
import com.bhn.webservice.ivr.IVRWrapperResponse;
import com.bhn.webservice.ivr.RequestContext;
import com.bhn.webservice.ivr.VerifyCardConvertResponse;
import com.bhn.webservice.ivr.VerifyCardHolderReceiveJSONResponse;
import com.bhn.webservice.ivr.VerifyCardHolderRequest;
import com.bhn.webservice.ivr.VerifyCardHolderResponse;
import com.bhn.webservice.ivr.VerifyCardHolderSendJSONRequest;
import com.bhn.webservice.ivr.VerifyCardReceiveJSONResponse;
import com.bhn.webservice.ivr.VerifyCardRequest;
import com.bhn.webservice.ivr.VerifyCardResponse;
import com.bhn.webservice.ivr.VerifyCardSendJSONRequest;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
  //XML mapper.
    ObjectMapper mapper = new XmlMapper();
                   mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,
                        false);
                mapper.enable(SerializationFeature.INDENT_OUTPUT);
GetCardInfo gci = mapper.readValue(JSONResponse.toString(),GetCardInfo.class);
下面是JSONResponse.toString()的输出

下面是GetCardInfo类

public class GetCardInfo {

    @XmlElement(name = "transactionId", required = true)
    public String transactionId;
    @XmlElement(name = "isCompleted", required = true)
    public Boolean isCompleted;
    @XmlElement(name = "percentComplete", required = true)
    public String percentComplete;

    @XmlElement(name = "card", required = true)
    public Card card; //Parent for remaining data

    public static class Card {
        @XmlElement(name = "id", required = true)
        public String id;
        @XmlElement(name = "bin", required = true)
        public String bin;
        @XmlElement(name = "proxyCardNumber", required = true)
        public String proxyCardNumber;
        @XmlElement(name = "isActive", required = true)
        public Boolean isActive;
        @XmlElement(name = "isRegistered", required = true)
        public Boolean isRegistered;
        @XmlElement(name = "expirationDate", required = true, type = String.class)
        @XmlJavaTypeAdapter(Adapter1 .class)
        @XmlSchemaType(name = "dateTime")
        public Date expirationDate;
        @XmlElement(name = "serviceCode", required = true)
        public String serviceCode;
        @XmlElement(name = "balances", required = true)
        public Balances balances; //Parent for balances data
        @XmlElement(name = "status", required = true)
        public String status;
        @XmlElement(name = "statusReason", required = true)
        public String statusReason;
        @XmlElement(name = "provisionType", required = true)
        public String provisionType;
        @XmlElement(name = "accountStatus", required = true)
        public String accountStatus;
        @XmlElement(name = "accountStatusReason", required = true)
        public String accountStatusReason;
        @XmlElement(name = "product", required = true)
        public Product product; 

        @Override
        public String toString() {
            return "Card [id=" + id + ", bin=" + bin + ", "
                    + "proxyCardNumber=" + proxyCardNumber + ", isActive=" + isActive
                    + ", isRegistered=" + isRegistered + ", expirationDate=" + expirationDate
                    + ", serviceCode=" + serviceCode + ", balances=" + balances
                    + ", status=" + status + ", statusReason=" + statusReason
                    + ", provisionType=" + provisionType + ", accountStatus=" + accountStatus
                    + ", accountStatusReason=" + accountStatusReason + ", product=" + product + "]";
        }
    }

    public static class Balances {
        @XmlElement(name = "openingBalance", required = true)
        public String openingBalance;
        @XmlElement(name = "closingBalance", required = true)
        public String closingBalance;
        @XmlElement(name = "pendingBalance", required = true)
        public String pendingBalance;
        @XmlElement(name = "currencyCode", required = true)
        public String currencyCode;

        @Override
        public String toString() {
            return "Balance [openingBalance=" + openingBalance + ", closingBalance=" + closingBalance + ", "
                    + "pendingBalance=" + pendingBalance + ", currencyCode=" + currencyCode + "]";
        }
    }

    public static class Product {
        @XmlElement(name = "id", required = true)
        public String id;
        @XmlElement(name = "name", required = true)
        public String name;
        @XmlElement(name = "isActive", required = true)
        public String isActive;
        @XmlElement(name = "productIdentifier", required = true)
        public String productIdentifier;
        @XmlElement(name = "bin", required = true)
        public String bin;
        @XmlElement(name = "issuer", required = true)
        public String issuer;

        @Override
        public String toString() {
            return "Card [id=" + id + ", bin=" + bin + ", "
                    + "name=" + name + ", isActive=" + isActive
                    + ", productIdentifier=" + productIdentifier + ", issuer=" + issuer + "]";
        }
    }

    @Override
    public String toString() {
        return "GetCardInfo [transactionId=" + transactionId
                + ", isCompleted=" + isCompleted
                + ", percentComplete=" + percentComplete
                + ", card=" + card + "]";
    }   

}
编辑: 我为IOException设置了一个catch块,发现我的值低于IOException。这意味着我的JSON字符串有问题

在下面添加了my POM.xml。还添加了上面包含ObjectMapper的Java文件的导入

捕获(IOE异常){ 记录器错误( “IOException-”, e、 getMessage()); e、 printStackTrace(); }

IOException -  com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '{' (code 123) in prolog; expected '<'
 at [row,col {unknown-source}]: [1,1]
日志显示它已成功转换为XML

<percentComplete>100</percentComplete><transactionId>FL2YTNR86KARMVYWWVK3410F4W</transactionId><card><product><productIdentifier>07675023660</productIdentifier><bin>451129</bin><name>EXM Visa Corp LAP</name><id>1000000000000000415</id><isActive>true</isActive><issuer>MetaBank</issuer></product><serviceCode>121</serviceCode><bin>451129</bin><isActive>false</isActive><proxyCardNumber>6039535101619469382</proxyCardNumber><accountStatusReason>NONE</accountStatusReason><accountStatus>OPEN</accountStatus><balances><pendingBalance>5000</pendingBalance><closingBalance>5000</closingBalance><openingBalance>5000</openingBalance><currencyCode>USD</currencyCode></balances><statusReason>NONE</statusReason><provisionType>PHYSICAL</provisionType><isRegistered>false</isRegistered><id>1000000000000098718</id><expirationDate>2017-06-30T23:59:59.000+0000</expirationDate><status>OPEN</status></card><isCompleted>true</isCompleted> 

现在我没有得到任何错误,但反序列化没有工作。GCI对象中的字段为空。

我对Jackson不在行,但您正在尝试使用XML映射器反序列化json文档

Jackson确切地告诉您,xml不能以“{”开头

您应该使用JsonMapper来反序列化Json,然后使用XMLMapper来序列化它


我不知道是否可以为这两个类注释同一个类。

多亏了@减号的输入。 我找到了答案

我所需要的只是将类名添加到我的XML字符串中,如下所示

JSONObject json = new JSONObject(JSONResponse.toString());
                xml = XML.toString(json);
                logger.info("GetCardInfo XML Response for KPN API: {} ", xml);  
字符串输入=“xml+”;
在此之后,我能够成功地反序列化。

编译和运行的代码以及pom.xml和导入将有所帮助。谢谢。我已经添加了pom.xml和导入。我仍在努力放置编译和运行的代码。此应用程序有多个文件,因此需要构建新的应用程序来演示此错误。非常感谢。B根据您的评论,我将JSON字符串转换为XML字符串,如下所示:
JSONObject json = new JSONObject(JSONResponse.toString());
                xml = XML.toString(json);
                logger.info("GetCardInfo XML Response for KPN API: {} ", xml);  
<percentComplete>100</percentComplete><transactionId>FL2YTNR86KARMVYWWVK3410F4W</transactionId><card><product><productIdentifier>07675023660</productIdentifier><bin>451129</bin><name>EXM Visa Corp LAP</name><id>1000000000000000415</id><isActive>true</isActive><issuer>MetaBank</issuer></product><serviceCode>121</serviceCode><bin>451129</bin><isActive>false</isActive><proxyCardNumber>6039535101619469382</proxyCardNumber><accountStatusReason>NONE</accountStatusReason><accountStatus>OPEN</accountStatus><balances><pendingBalance>5000</pendingBalance><closingBalance>5000</closingBalance><openingBalance>5000</openingBalance><currencyCode>USD</currencyCode></balances><statusReason>NONE</statusReason><provisionType>PHYSICAL</provisionType><isRegistered>false</isRegistered><id>1000000000000098718</id><expirationDate>2017-06-30T23:59:59.000+0000</expirationDate><status>OPEN</status></card><isCompleted>true</isCompleted> 
   GetCardInfo gci = mapper.readValue(xml, GetCardInfo.class);
                    logger.info("Test12 ", gci.toString());