Hello all,

This question is related to that one 
<https://groups.google.com/d/msg/golang-nuts/nIshrMRrAt0/KSnwExJ4DAAJ> 
(which gives more detailed motivation).

Assume I have some public type 
Person = struct { 
  PersName: string `json:"name"` 
  PersPhone: int `json:"phone"` 
}



I want to unmarshal (i.e. JSON decode) some JSON, with e.g. the following 
rules

a scalar JSON integer is decoded as some Go int64. So Json 123 *⇾* Go 
int64(123) etc....

a scalar JSON string is decoded as some Go string. So JSON "abc" *⇾* Go 
string("abc") etc...

a JSON object is decoded according to its *first* name:

   - when that name is "transl" the corresponding value is a number, and 
   the decoding is the closure of that mathematical translation 
   <https://en.wikipedia.org/wiki/Translation_%28geometry%29>. So the JSON { 
   "transl" : 1 }  *⇾* Go closure  func(x int) { return x + 1}  (of course 
   the 1 would actually be the binding of a captured variable y in some 
   closure func(x int) { return x + y }).
   - when that name is "strings" the corresponding value is a JSON array of 
   strings, and its decoding is the slice of such strings. So the JSON { 
   "strings" : [ "a", "b" ] } *⇾* Go strings slice []string{"a","b"}
   - when that name is "name", there is a second name "phone", and its 
   decoding is the appropriate instance of Person. So the JSON { "name" : 
   "John Smith", "phone": 1234567 }
   *⇾* Go Person{PersName:"John Smith", PersPhone: 1234567}

I don't care for other cases or forms of JSON (in particular other forms of 
JSON objects). The decoding (or unmarshaling) could fail (or give some 
other value).

How can I achieve that? I believe that I understand how to code the 
corresponding encoding. I was thinking of using perhaps some dec 
json.Decoder then use dec.Token(), but I am not sure to be able to handle 
the Person case (how to parse two fields). It is strange that not every 
JSON token is actually publicly visible (colons and commas are not).

Of course the actual case is a bit more complex (and not exactly what I am 
explaining above, which is just a simplified example). See my commit 
c8a9212eccbdf2 
<https://github.com/bstarynk/monimelt/commit/c8a9212eccbdf2fa6f74758c2a0c6c75d1dfaa04>

Thanks for reading.

-- 
Basile Starynkevitch <http://starynkevitch.net/Basile/> (France)

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to