2017-02-20 5 views
0

私はMoxyを使用してJSONベースのAPIをシリアル化しています。 ちょっとしたこと以外は魅力的です: フィールド名をfieldNameとしてフィールドをシリアライズすることはできません。MOXYフィールド名のURLを使用したJSONの非マーシャル

は、ここで私が達成しようとしているものです:

FOO.CLASS:

package test; 

import javax.xml.bind.annotation.XmlElement; 

public class Foo { 

@XmlElement(name = "http://www.foo.bar") 
private String bar; 

private String foo; 

@XmlElement(name = "_foo_bar") 
private String fooBar; 

public String getBar() { 
    return bar; 
} 

public void setBar(String bar) { 
    this.bar = bar; 
} 

public String getFoo() { 
    return foo; 
} 

public void setFoo(String foo) { 
    this.foo = foo; 
} 

public String getFooBar() { 
    return fooBar; 
} 

public void setFooBar(String fooBar) { 
    this.fooBar = fooBar; 
} 

} 

Testクラス:

package test; 

import java.io.StringReader; 
import java.util.HashMap; 
import java.util.Map; 
import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 
import javax.xml.bind.Unmarshaller; 
import javax.xml.transform.stream.StreamSource; 
import org.eclipse.persistence.jaxb.JAXBContextProperties; 

public class TestMoxy { 

public static void main(String[] args) { 
    String json = "{\"http://www.foo.bar\":\"BAR\",\"foo\":\"FOO\",\"_foo_bar\":\"FOOBAR\"}"; 
    System.out.println(json); 

    Foo f = unMarshal(json); 
    System.out.println(f.getBar()); 
    System.out.println(f.getFoo()); 
    System.out.println(f.getFooBar()); 
} 

public static Foo unMarshal(final String jsonString) { 
    try { 
     Map<String, Object> properties = new HashMap<String, Object>(2); 
     properties.put(JAXBContextProperties.MEDIA_TYPE, "application/json"); 
     properties.put(JAXBContextProperties.JSON_INCLUDE_ROOT, false); 

     JAXBContext jc = JAXBContext.newInstance(new Class[] {Foo.class}, properties);  
     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     StringReader reader = new StringReader(jsonString); 
     Foo f = unmarshaller.unmarshal(new StreamSource(reader),Foo.class).getValue(); 
     return f; 
    } catch (final JAXBException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 
} 

今、出力は次のようである:

{"http://www.foo.bar":"BAR","foo":"FOO","_foo_bar":"FOOBAR"} 
null 
FOO 
FOOBAR 

質問は次のとおりです。どのように最初の属性のアンマーシャリングを修正するには?

+0

必要にアンマーシャリングJSONにMOXYライブラリを使用するには、[EclipseLinkのランタイムを指定](http://www.eclipse.org/eclipselink/documentation/2.4/moxy /runtime001.htm#CACFEGHC): '-Djavax.xml.bind.context.factory = org.eclipse.persistence.jaxb.JAXBContextFactory'、これは答えではなく、調査するのに役立ちます。 – James

+0

Jamesさん、こんなことは言わなかったけど、これはclasspath 'jaxb.properties'のファイルを使って行っています: 'javax.xml.bind.context.factory = org.eclipse.persistence.jaxb.JAXBContextFactory' – user7595421

答えて

0

これは私にとってMOXyのバグのようですが、特殊文字の組み合わせをいくつか試しましたが、MOXyは:または\\のようには見えません。 http://https://、さらにはhttp//は無視されているようです(依存関係org.eclipse.persistence:org.eclipse.persistence.moxy:2.6.0を使用していました)。URLのように構成されたプロパティ名を処理する機能が本当に必要な場合は、他のライブラリを見てみるといいでしょう。

私はあなたの例では、ジャクソンとかなり迅速に作業を取得することができました。:

Mavenの依存関係:

<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-databind</artifactId> 
    <version>2.7.0</version> 
</dependency> 

FOO.CLASS:

package test; 

import com.fasterxml.jackson.annotation.JsonProperty; 

public class Foo { 

    @JsonProperty(value = "http://www.foo.bar") 
    private String bar; 

    private String foo; 

    @JsonProperty(value = "_foo_bar") 
    private String fooBar; 

    public String getBar() { 
     return bar; 
    } 

    public void setBar(String bar) { 
     this.bar = bar; 
    } 

    public String getFoo() { 
     return foo; 
    } 

    public void setFoo(String foo) { 
     this.foo = foo; 
    } 

    public String getFooBar() { 
     return fooBar; 
    } 

    public void setFooBar(String fooBar) { 
     this.fooBar = fooBar; 
    } 
} 

メイン/ Testクラス

package test; 

import com.fasterxml.jackson.databind.ObjectMapper; 
import java.io.IOException; 

public class TestMoxy { 

    public static void main(String[] args) { 
     String json = "{\"http://www.foo.bar\":\"BAR\",\"foo\":\"FOO\",\"_foo_bar\":\"FOOBAR\"}"; 
     System.out.println(json); 

     Foo f = unMarshal(json); 
     System.out.println(f.getBar()); 
     System.out.println(f.getFoo()); 
     System.out.println(f.getFooBar()); 
    } 

    public static Foo unMarshal(String jsonString) { 
     try { 
      ObjectMapper mapper = new ObjectMapper(); 
      return mapper.readValue(jsonString, Foo.class); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return new Foo(); 
    } 
} 
関連する問題