Adrian Crum wrote:
> Every programmer has their own design style. This would be mine:
>
> class JsonString {
> public String toString() {
> ...
> }
> }
>
> public static class ListToJsonString<T> extends AbstractConverter<List<T>,
> JsonString> {
> public ListToJsonString() {
> super(List.class, JsonString .class);
> }
> ...
> }
>
> The problem I have with your approach is the fact that there is no way to
> know that converting object x to a String will result in a JSON string. In
> addition, I was hoping we could stick to this pattern: Converting any Java
> type to a String is the same as calling the object's toString() method.
>
> -Adrian
Yeah, I thought you would comment on this.
Should ListToString and StringToList be reflective? As they used to
be, they weren't. If I stuffed something else into the list,
ListToString would handle it, by calling toString on the object. But,
then, StringToList wouldn't handle it correctly. What if I put a
string into the original list that had a comma in it, or some other
special character?
I think the conversion framework should be conscise.
Another option is to have a non-static Converters registry; this way,
I could override some converters with a json compatible way. If you
so desire, I can do this.
>
>
> --- On Wed, 2/10/10, [email protected] <[email protected]> wrote:
>
>> From: [email protected] <[email protected]>
>> Subject: svn commit: r908713 - in
>> /ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion:
>> CollectionConverters.java test/MiscTests.java
>> To: [email protected]
>> Date: Wednesday, February 10, 2010, 2:48 PM
>> Author: doogie
>> Date: Wed Feb 10 22:48:07 2010
>> New Revision: 908713
>>
>> URL: http://svn.apache.org/viewvc?rev=908713&view=rev
>> Log:
>> Switch the collection/string converters to the json
>> parser.
>>
>> Modified:
>>
>> ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/CollectionConverters.java
>>
>> ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/test/MiscTests.java
>>
>> Modified:
>> ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/CollectionConverters.java
>> URL:
>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/CollectionConverters.java?rev=908713&r1=908712&r2=908713&view=diff
>> ==============================================================================
>> ---
>> ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/CollectionConverters.java
>> (original)
>> +++
>> ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/CollectionConverters.java
>> Wed Feb 10 22:48:07 2010
>> @@ -18,13 +18,17 @@
>>
>> *******************************************************************************/
>> package org.ofbiz.base.conversion;
>>
>> +import java.io.IOException;
>> +import java.io.StringReader;
>> +import java.io.StringWriter;
>> import java.util.Arrays;
>> import java.util.List;
>> import java.util.Map;
>> import java.util.Set;
>>
>> import org.ofbiz.base.util.ObjectType;
>> -import org.ofbiz.base.util.StringUtil;
>> +import org.ofbiz.base.json.JSON;
>> +import org.ofbiz.base.json.JSONWriter;
>>
>> import javolution.util.FastList;
>> import javolution.util.FastSet;
>> @@ -52,7 +56,13 @@
>> }
>>
>> public String
>> convert(List<T> obj) throws ConversionException {
>> - return
>> obj.toString();
>> + StringWriter sw
>> = new StringWriter();
>> + try {
>> +
>> new JSONWriter(sw).write(obj);
>> + } catch
>> (IOException e) {
>> +
>> throw new ConversionException(e);
>> + }
>> + return
>> sw.toString();
>> }
>> }
>>
>> @@ -86,51 +96,62 @@
>> }
>>
>> public String
>> convert(Map<K, V> obj) throws ConversionException {
>> - return
>> obj.toString();
>> + StringWriter sw
>> = new StringWriter();
>> + try {
>> +
>> new JSONWriter(sw).write(obj);
>> + } catch
>> (IOException e) {
>> +
>> throw new ConversionException(e);
>> + }
>> + return
>> sw.toString();
>> }
>> }
>>
>> - public static class StringToList extends
>> AbstractConverter<String, List<String>> {
>> + public static class StringToList extends
>> AbstractConverter<String, List<Object>> {
>> public
>> StringToList() {
>>
>> super(String.class, List.class);
>> }
>>
>> - public List<String>
>> convert(String obj) throws ConversionException {
>> - if
>> (obj.startsWith("[") && obj.endsWith("]")) {
>> -
>> return StringUtil.toList(obj);
>> - } else {
>> -
>> List<String> tempList = FastList.newInstance();
>> -
>> tempList.add(obj);
>> -
>> return tempList;
>> + public List<Object>
>> convert(String obj) throws ConversionException {
>> + try {
>> +
>> return new JSON(new StringReader(obj)).JSONArray();
>> + } catch
>> (RuntimeException e) {
>> +
>> throw e;
>> + } catch
>> (Exception e) {
>> +
>> throw new ConversionException(e);
>> }
>> }
>> }
>>
>> - public static class StringToMap extends
>> AbstractConverter<String, Map<String, String>>
>> {
>> + public static class StringToMap extends
>> AbstractConverter<String, Map<String, Object>>
>> {
>> public StringToMap()
>> {
>>
>> super(String.class, Map.class);
>> }
>>
>> - public Map<String,
>> String> convert(String obj) throws ConversionException {
>> - if
>> (obj.startsWith("{") && obj.endsWith("}")) {
>> -
>> return StringUtil.toMap(obj);
>> + public Map<String,
>> Object> convert(String obj) throws ConversionException {
>> + try {
>> +
>> return new JSON(new StringReader(obj)).JSONObject();
>> + } catch
>> (RuntimeException e) {
>> +
>> throw e;
>> + } catch
>> (Exception e) {
>> +
>> throw new ConversionException(e);
>> }
>> - throw new
>> ConversionException("Could not convert " + obj + " to Map:
>> ");
>> }
>> }
>>
>> - public static class StringToSet extends
>> AbstractConverter<String, Set<String>> {
>> + public static class StringToSet extends
>> AbstractConverter<String, Set<Object>> {
>> public StringToSet()
>> {
>>
>> super(String.class, Set.class);
>> }
>>
>> - public Set<String>
>> convert(String obj) throws ConversionException {
>> - if
>> (obj.startsWith("[") && obj.endsWith("]")) {
>> -
>> return StringUtil.toSet(obj);
>> - } else {
>> -
>> Set<String> tempSet = FastSet.newInstance();
>> -
>> tempSet.add(obj);
>> -
>> return tempSet;
>> + public Set<Object>
>> convert(String obj) throws ConversionException {
>> + try {
>> +
>> Set<Object> set = FastSet.newInstance();
>> +
>> set.addAll(new JSON(new StringReader(obj)).JSONArray());
>> +
>> return set;
>> + } catch
>> (RuntimeException e) {
>> +
>> throw e;
>> + } catch
>> (Exception e) {
>> +
>> throw new ConversionException(e);
>> }
>> }
>> }
>>
>> Modified:
>> ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/test/MiscTests.java
>> URL:
>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/test/MiscTests.java?rev=908713&r1=908712&r2=908713&view=diff
>> ==============================================================================
>> ---
>> ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/test/MiscTests.java
>> (original)
>> +++
>> ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/test/MiscTests.java
>> Wed Feb 10 22:48:07 2010
>> @@ -47,7 +47,7 @@
>> public void
>> testExtendsImplements() throws Exception {
>> List<String>
>> arraysList = Arrays.asList("a", "b", "c");
>> Converter converter
>> = Converters.getConverter(arraysList.getClass(),
>> String.class);
>> - assertEquals("", "[a, b, c]",
>> converter.convert(arraysList));
>> + assertEquals("", "[\n \"a\",\n
>> \"b\",\n \"c\"\n]", converter.convert(arraysList));
>> Exception caught =
>> null;
>> try {
>>
>> Converters.getConverter(MiscTests.class,
>> String.class);
>> @@ -59,7 +59,7 @@
>> LRUMap<String,
>> String> map = new LRUMap<String, String>();
>> map.put("a", "1");
>> converter =
>> Converters.getConverter(LRUMap.class, String.class);
>> - assertEquals("", "{a=1}",
>> converter.convert(map));
>> + assertEquals("", "{\n \"a\":
>> \"1\"\n}", converter.convert(map));
>> }
>>
>> public void testPassthru() throws
>> Exception {
>>
>>
>>
>
>
>