package org.zbus.common.json.serializer; import java.io.IOException; import java.lang.reflect.Type; import java.net.InetAddress; import java.net.InetSocketAddress; import org.zbus.common.json.JSONException; import org.zbus.common.json.parser.DefaultJSONParser; import org.zbus.common.json.parser.JSONLexer; import org.zbus.common.json.parser.JSONToken; import org.zbus.common.json.parser.deserializer.ObjectDeserializer; public class InetSocketAddressCodec implements ObjectSerializer, ObjectDeserializer { public static InetSocketAddressCodec instance = new InetSocketAddressCodec(); public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType) throws IOException { if (object == null) { serializer.writeNull(); return; } SerializeWriter out = serializer.getWriter(); InetSocketAddress address = (InetSocketAddress) object; InetAddress inetAddress = address.getAddress(); out.write('{'); if (inetAddress != null) { out.writeFieldName("address"); serializer.write(inetAddress); out.write(','); } out.writeFieldName("port"); out.writeInt(address.getPort()); out.write('}'); } @SuppressWarnings("unchecked") public <T> T deserialze(DefaultJSONParser parser, Type clazz, Object fieldName) { JSONLexer lexer = parser.getLexer(); if (lexer.token() == JSONToken.NULL) { lexer.nextToken(); return null; } parser.accept(JSONToken.LBRACE); InetAddress address = null; int port = 0; for (;;) { String key = lexer.stringVal(); lexer.nextToken(JSONToken.COLON); if (key.equals("address")) { parser.accept(JSONToken.COLON); address = parser.parseObject(InetAddress.class); } else if (key.equals("port")) { parser.accept(JSONToken.COLON); if (lexer.token() != JSONToken.LITERAL_INT) { throw new JSONException("port is not int"); } port = lexer.intValue(); lexer.nextToken(); } else { parser.accept(JSONToken.COLON); parser.parse(); } if (lexer.token() == JSONToken.COMMA) { lexer.nextToken(); continue; } break; } parser.accept(JSONToken.RBRACE); return (T) new InetSocketAddress(address, port); } public int getFastMatchToken() { return JSONToken.LBRACE; } }