GVKun编程网logo

使用jackson和spring-boot将base64编码的JSON解码为POJO

14

关于使用jackson和spring-boot将base64编码的JSON解码为POJO的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于android–使用jackson对象映射器将JSO

关于使用jackson和spring-boot将base64编码的JSON解码为POJO的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于android – 使用jackson对象映射器将JSON数组转换为POJO、asp.net-mvc – 带有Base64编码的JsonResult、Jackson:使用jackson将json字符串响应转换为pojo转换时过滤空值或空值、javascript – 如何用JS / PHP解码base64编码的图像? (以前使用Actionscript编码)等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

使用jackson和spring-boot将base64编码的JSON解码为POJO

使用jackson和spring-boot将base64编码的JSON解码为POJO

我有这样的要求

{    "varA"  : "A",    "varB" : "TCFNhbiBKb3NlMRgwFgYDVQQK"}

其中key varB是base64编码的JSON字符串。像这样的东西:

{    "nestedVarB1": "some value here",    "nestedVarB2" : "some other value here"}

我想将其转换成这样的一些POJO:

@Datapublic class MyRequest {    private String varA;    private B varB;}@Datapublic class B {    private String nestedVarB1;    private String nestedVarB2;}

如何将JSON直接转换为MyRequest使用Jackson和Spring Boot的转换?

注意:

  1. POJO MyRequestB非常大,B可以进一步嵌套,因此手动进行将是一项艰巨的任务。
  2. 我无法控制来自第三方的请求。因此,无法更改请求的格式。

答案1

小编典典

我已经做了一些实验,这是一个简单的Jackson Deserializer,应该可以为您工作。

Deserializer实现ContextualDeserializer接口以访问实际的bean属性(例如varB)。这是检测正确结果类型的必要条件,因为解串器本身可以附加到任何类型的字段。

import com.fasterxml.jackson.core.JsonParser;import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jackson.databind.*;import com.fasterxml.jackson.databind.deser.ContextualDeserializer;import com.fasterxml.jackson.databind.exc.InvalidFormatException;import java.io.IOException;import java.util.Base64;public class Base64Deserializer extends JsonDeserializer<Object> implements ContextualDeserializer {    private Class<?> resultClass;    @Override    public JsonDeserializer<?> createContextual(DeserializationContext context, BeanProperty property) throws JsonMappingException {        this.resultClass = property.getType().getRawClass();        return this;    }    @Override    public Object deserialize(JsonParser parser, DeserializationContext context) throws IOException, JsonProcessingException {        String value = parser.getValueAsString();        Base64.Decoder decoder = Base64.getDecoder();        try {            ObjectMapper objectMapper = new ObjectMapper();            byte[] decodedValue = decoder.decode(value);            return objectMapper.readValue(decodedValue, this.resultClass);        } catch (IllegalArgumentException | JsonParseException e) {            String fieldName = parser.getParsingContext().getCurrentName();            Class<?> wrapperClass = parser.getParsingContext().getCurrentValue().getClass();            throw new InvalidFormatException(                parser,                String.format("Value for ''%s'' is not a base64 encoded JSON", fieldName),                value,                wrapperClass            );        }    }}

这是一个映射类的例子。

public class MyRequest {    private String varA;    @JsonDeserialize(using = Base64Deserializer.class)    private B varB;    public String getVarA() {        return varA;    }    public void setVarA(String varA) {        this.varA = varA;    }    public B getVarB() {        return varB;    }    public void setVarB(B varB) {        this.varB = varB;    }}

android – 使用jackson对象映射器将JSON数组转换为POJO

android – 使用jackson对象映射器将JSON数组转换为POJO

这可能是一个重复的问题..请参阅此 link.
我能够将一个json对象映射到POJO.But如何使用相同的jackson框架将json对象的数组转换为pojo.
private void jsonToPojo(){
   ObjectMapper mapper=new ObjectMapper();

    try {
        User1 user1=mapper.readValue(readFromFile(),User1.class);
        User1[] user2=mapper.readValue(readFromFile(),User1[].class);
        System.out.println(user1);
        Toast.makeText(getApplicationContext(),"inside try",0).show();
    } catch (JsonParseException e) {
        // Todo Auto-generated catch block
        Log.i("Exception","jsonparseexception");
        e.printstacktrace();
    } catch (JsonMappingException e) {
        // Todo Auto-generated catch block
        Log.i("Exception","jsonmapping exception");
        e.printstacktrace();
    } catch (IOException e) {
        // Todo Auto-generated catch block
        Log.i("Exception","ioexception");
        e.printstacktrace();
    }
}

这是类用户对象.

public class User {
private int age = 23;
private String name = "amal";
private List<String> messages = new ArrayList<String>() {
    {
        add("hi");
        add("how");
        add("are u.");
    }
};

//getter and setter methods

@Override
public String toString() {
    return "User [age=" + age + ",name=" + name + "," +
            "messages=" + messages + "]";
}

这是我试图做的:(readFromFile()从文件中获取json)

User1[] user2=mapper.readValue(readFromFile(),User1[].class);

jsonToPojo()仅适用于一个对象.但是,如果我尝试上面的代码行,它不会采取以下json:

[ 
 {
   "age":"23","messages":["hi","how","are u."],"name":"amal"
 },{
   "age":"98","messages":["Reply","my","question"],"name":"You"
 }
]

解决方法

尝试这样的事情:
public class Test {

/**
 * @param args
 */
public static void main(String[] args) {
    User a = new User(23,"amal");
    ArrayList<String> message = new ArrayList<String>();
    message.add("m1");
    message.add("m2");
    a.setMessages(message);

    User b = new User(58,"pete");
    User[] ab = new User[] {a,b};

    ObjectMapper mapper = new ObjectMapper();

    try {
        String s1 = getJson1(a);
        System.out.println(s1);
        User user1 = mapper.readValue(s1,User.class);
        System.out.println(user1);

        System.out.println("----------------");

        String s2 = getJson2(ab);
        System.out.println(s2);
        User[] user2 = mapper.readValue(s2,User[].class);
        for (User u : user2)
            System.out.println(u);

    } catch (Exception e) {
        e.printstacktrace();
    }

}

    private static String getJson1(User user) throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        return mapper.writeValueAsstring(user);
    }

    private static String getJson2(User[] ab) throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        return mapper.writeValueAsstring(ab);
    }

}

public class User {
    private int               age;
    private String            name;
    private ArrayList<String> messages;

    public User() {
        super();
    }

    public User(int age,String name) {
        this();
        this.age = age;
        this.name = name;
    }

    // ****************
    // Getter & Setter ....
    // ****************
}

你会得到这个输出:

{"age":23,"name":"amal","messages":["m1","m2"]}
User [age=23,name=amal,messages=[m1,m2]]
----------------
[{"age":23,"m2"]},{"age":58,"name":"pete","messages":null}]
User [age=23,m2]]
User [age=58,name=pete,messages=null]

asp.net-mvc – 带有Base64编码的JsonResult

asp.net-mvc – 带有Base64编码的JsonResult

我使用Json(object)在ASP.Net MVC中返回JsonResult.

对象中的一个属性是必须为Base64编码的字符串.

public class MyClass
{
   public string BlockOfText = "Hello World";
}

应该转换为以下Json结果

{
     "BlockOfText" : "SGVsbG8gV29ybGQ="
}

如何告诉Json Serializer将属性编码为Base64?

解决方法

一种解决方案是基于编码您的字符串服务器.
在序列化对象之前,只需执行以下操作:

var instance.BlockOfText64Base = System.Convert.ToBase64String(Encoding.Default.GetBytes(instance.BlockOfText));
return Json(instance,JsonRequestBehavior.AllowGet);

希望能帮助到你.

Jackson:使用jackson将json字符串响应转换为pojo转换时过滤空值或空值

Jackson:使用jackson将json字符串响应转换为pojo转换时过滤空值或空值

我正在使用杰克逊将杰森的回应转换为pojo列表.以下是我得到的回复.

[

    {
        "code": "","total": 24,"name": null
    },{
        "code": "","total": 1,"name": "Test"
    }
]

我正在将它转换为Pojo列表.下面是我的pojo.

public class ItemCategory {

private String code;
private String name;
private String total;

public ItemCategory() {
}

public ItemCategory(final String code,final String name,final String total) {
    super();
    this.code = code;
    this.name = name;
    this.total = total;
}

/**
 * @return the code
 */
public String getCode() {
    return code;
}

/**
 * @param code
 *            the code to set
 */
public void setCode(final String code) {
    this.code = code;
}

/**
 * @return the name
 */
public String getName() {
    return name;
}

/**
 * @param name
 *            the name to set
 */
public void setName(final String name) {
    this.name = name;
}

/**
 * @return the count
 */
public String getTotal() {
    return total;
}

/**
 * @param count
 *            the count to set
 */
public void setTotal(final String total) {
    this.total = total;
}
}

一切正常.但我想删除要转换为pojo的值,其代码为空/空值.即“代码”:“”,或“代码”:null

我使用下面的jackson代码将json转换为pojo.

Object pojo = null;
try {
    pojo = mapper.readValue(jsonString,typeReference);
} catch (JsonParseException e) {
    throw new InvalidPojoException(e.toString(),e);
} catch (JsonMappingException e) {
    throw new InvalidPojoException(e.toString(),e);
} catch (IOException e) {
    throw new InvalidPojoException(e.toString(),e);
} catch (Exception e) {
    throw new InvalidPojoException(e.toString(),e);
}
return pojo;

使用以下代码为json对象.

(List<ItemCategory>) JsonParserUtil.toPojo(serviceResponse.getStringResponse(),new TypeReference<List<ItemCategory>>(){});

任何指针都会受到赞赏.

提前致谢.

解决方法

你可能想要像这样注释你的bean类:

@JsonSerialize(
include=JsonSerialize.Inclusion.NON_NULL,)

javascript – 如何用JS / PHP解码base64编码的图像? (以前使用Actionscript编码)

javascript – 如何用JS / PHP解码base64编码的图像? (以前使用Actionscript编码)

我有一个编码为base64的图像,使用ActionScript函数制作:

private static const BASE64_CHARS:String = "ABCDEFGHIJKLMnopQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

public static function encodeByteArray(_arg1:ByteArray):String {
   var _local3:Array;
   var _local5:uint;
   var _local6:uint;
   var _local7:uint;
   var _local2 = "";
   var _local4:Array = new Array(4);
   _arg1.position = 0;
   while (_arg1.bytesAvailable > 0) {
        _local3 = new Array();
        _local5 = 0;
        while ((((_local5 < 3)) && ((_arg1.bytesAvailable > 0)))) {
            _local3[_local5] = _arg1.readUnsignedByte();
            _local5++;
        };
        _local4[0] = ((_local3[0] & 252) >> 2);
        _local4[1] = (((_local3[0] & 3) << 4) | (_local3[1] >> 4));
        _local4[2] = (((_local3[1] & 15) << 2) | (_local3[2] >> 6));
        _local4[3] = (_local3[2] & 63);
        _local6 = _local3.length;
        while (_local6 < 3) {
            _local4[(_local6 + 1)] = 64;
            _local6++;
        };
        _local7 = 0;
        while (_local7 < _local4.length) {
            _local2 = (_local2 + BASE64_CHARS.charat(_local4[_local7]));
            _local7++;
        };
    };
    return (_local2);
}

现在我正在尝试解码(没有成功)JS / PHP中的字符串并返回图像.
这是Actionscript解码函数:

public static function decodetoByteArray(_arg1:String):ByteArray{
    var _local6:uint;
    var _local7:uint;
    var _local2:ByteArray = new ByteArray();
    var _local3:Array = new Array(4);
    var _local4:Array = new Array(3);
    var _local5:uint;
    while (_local5 < _arg1.length) {
        _local6 = 0;
        while ((((_local6 < 4)) && (((_local5 + _local6) < _arg1.length)))) {
            _local3[_local6] = BASE64_CHARS.indexOf(_arg1.charat((_local5 + _local6)));
            _local6++;
        };
        _local4[0] = ((_local3[0] << 2) + ((_local3[1] & 48) >> 4));
        _local4[1] = (((_local3[1] & 15) << 4) + ((_local3[2] & 60) >> 2));
        _local4[2] = (((_local3[2] & 3) << 6) + _local3[3]);
        _local7 = 0;
        while (_local7 < _local4.length) {
            if (_local3[(_local7 + 1)] == 64){
                break;
            };
            _local2.writeByte(_local4[_local7]);
            _local7++;
        };
        _local5 = (_local5 + 4);
    };
    _local2.position = 0;
    return (_local2);
}

我试图将解码Aactionscript函数转换为JS,但我错过了新的ByteArray();我不知道如何管理.
我需要一种方法将编码的图像字符串解码回图像.
这里是一个使用“encodeByteArray”函数编码的图像的base64字符串示例:

sample base64 encoded string

谢谢您的帮助.

解决方法

要输出base64图像,请使用以下格式:

<img src="data:image/png;base64,ABCDEFGHIJKLMnopQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" />

关于使用jackson和spring-boot将base64编码的JSON解码为POJO的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于android – 使用jackson对象映射器将JSON数组转换为POJO、asp.net-mvc – 带有Base64编码的JsonResult、Jackson:使用jackson将json字符串响应转换为pojo转换时过滤空值或空值、javascript – 如何用JS / PHP解码base64编码的图像? (以前使用Actionscript编码)等相关内容,可以在本站寻找。

本文标签: