Hi Sean, 

thanks for your help but we found another problem:

after we insert the valid json:
        {ok,Pid} = riakc_pb_socket:start_link("10.10.10.74", 8087),
        Value = mochijson2:encode({struct, [{id, 22}]}),
        In = riakc_obj:new(<<"mm">>,<<"1">>,Value,"application/json"),
        riakc_pb_socket:put(Pid,In)

we read it from erlang:

        {ok, Obj} = riakc_pb_socket:get(Pid,"mm","1"),
        io:format("Obj: ~p~n",[Obj]),
        ContentType = riakc_obj:get_content_type(Obj),
        io:format("ContentType: ~p~n",[ContentType]),

Obj: {riakc_obj,"mm","1",
                <<107,206,97,96,96,96,204,96,202,5,82,28,202,156,255,126,250,
                  
115,109,75,206,96,74,228,206,99,101,152,17,87,127,130,47,11,0>>,
                [{{dict,3,16,16,8,80,48,
                        {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},
                        {{[],[],[],[],[],[],[],[],[],[],
                          [[<<"X-Riak-VTag">>,51,122,101,57,117,75,111,98,113,
                            118,97,77,100,117,114,76,97,56,122,68,115,70],
                           [<<"content-type">>,97,112,112,108,105,99,97,116,
                            105,111,110,47,120,45,101,114,108,97,110,103,45,
                            98,105,110,97,114,121]],
                          [],[],
                          [[<<"X-Riak-Last-Modified">>|{1326,113432,240315}]],
                          [],[]}}},
                  <<131,107,0,4,84,69,83,84>>}],
                undefined,undefined}
ContentType: "application/x-erlang-binary"

We received every time x-erlang-binary

When we wrote the same over the http api for example: 

curl -X PUT -H "Content-Type: application/json" -i 
http://127.0.0.1:8098/riak/mm/2 -d '{"email:","email to 
email.com","pass":"123123"}'

Obj: {riakc_obj,"mm","2",
                <<107,206,97,96,96,96,204,96,202,5,82,28,202,156,255,126,250,
                  115,157,14,206,96,74,100,204,99,101,232,115,175,63,193,151,5,
                  0>>,
                [{{dict,3,16,16,8,80,48,
                        {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},
                        {{[],[],[],[],[],[],[],[],[],[],
                          [[<<"X-Riak-VTag">>,122,97,52,89,80,115,106,112,121,
                            57,118,98,68,81,114,66,56,72,109,78,52],
                           [<<"content-type">>,97,112,112,108,105,99,97,116,
                            105,111,110,47,106,115,111,110]],
                          [],[],
                          [[<<"X-Riak-Last-Modified">>|{1326,107534,668061}]],
                          [],[]}}},
                  <<"{\"email:\",\"email to 
email.com\",\"pass\":\"123123\"}">>}],
                undefined,undefined}
ContentType: "application/json"


It looks like the risk_obj:new don't write the right content-type. 

Can you imagine why ? 

Thanks
Marcel 


Am 07.01.2012 um 18:29 schrieb Sean Cribbs:

> Marcel,
> 
>     {ok,Pid} = riakc_pb_socket:start_link("127.0.0.1", 8087),
>     Tuple = "{\"id\",22}",
> 
> That is not valid JSON, first of all. 
>  
>     Obj = riakc_obj:new("mm","1",Tuple),
> 
> Make sure that you set the content type here, otherwise it won't be detected 
> on the Java side. (example below)
>  
>     riakc_pb_socket:put(Pid,Obj),
> 
> After then we try to read from risk-java-client:
> 
>       RiakClient httpClient = new RiakClient("http://10.10.10.61:8098/riak";);
>         IRiakClient client = RiakFactory.httpClient(httpClient);
>         Bucket b = client.fetchBucket("mm").execute();
>         IRiakObject fetched = b.fetch("1").execute();
>         String decodedString = new String(fetched.getValue());
>         System.out.println(decodedString);
> 
> I convert the Object to an HexString: 83 6B 00 05 7B 22 6E 22 7D
> 
> 
> Decoding that byte array in Erlang gives:
> 
> 1> <<16#83,16#6B,0,5,16#7B,16#22,16#6E,16#22,16#7D>>.
> <<131,107,0,5,123,34,110,34,125>>
> 2> binary_to_term(v(1)).
> "{\"n\"}"
> 3>  
> 
> The default behavior of the Erlang client is to serialize terms to binary 
> unless the content type is explicit and the value of the object is a binary. 
> Try this instead:
> 
> Value = mochijson2:encode({struct, [{id, 22}]}),
> Obj = riakc_obj:new(<<"mm">>,<<"1">>,Value,"application/json"),
> riakc_pb_socket:put(Pid, Obj)
>  
> Then re-read it from the Java side and you should get what you expect.
> 
> My question is: 
> 
> 1. What are the first 4 bytes ? 
> 
> A binary that starts with byte 131 is typically in Erlang 
> term_to_binary/binary_to_term format.
>  
> 2. how can i receive a string with out the 4 bytes ? 
> 
> See above.
>  
> 3. How can i convert the string into a JSON Object ? 
> 
> 
> See above, and then use Jackson to decode the value (I believe the Java 
> client may do this automatically for you).
>  
> -- 
> Sean Cribbs <s...@basho.com>
> Software Engineer
> Basho Technologies, Inc.
> http://basho.com/
> 

_______________________________________________
riak-users mailing list
riak-users@lists.basho.com
http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com

Reply via email to