How to convert JSON to a hash, search for and change a value

后端 未结 1 1963
予麋鹿
予麋鹿 2020-12-20 01:31

I\'m trying to process a JSON file:

{
  \"features\": {
    \"additional-options\": true
  },
  \"values\": {
    \"lo-value\": 34,
    \"hi-value\": 554
  }         


        
相关标签:
1条回答
  • 2020-12-20 01:41

    I understand your JSON may look like this:

    "{\"features\":{\"additional-options\":true},\"values\":{\"lo-value\":34,\"hi-value\":554},\"persons\":[{\"name\":\"john\",\"member\":true,\"current\":false,\"sponsor\":\"pete\",\"profile\":\"\",\"credits\":[\"04\"],\"linked\":[\"philip\",\"guy\"],\"maptools\":[\"crossfit\",\"soccer\",\"running\"]},{\"name\":\"mary\",\"member\":true,\"current\":false,\"sponsor\":\"judy\",\"profile\":\"\",\"credits\":[\"all\"],\"activities\":[\"swimming\",\"cycling\",\"running\"]}],\"data_map\":[1122,3234]}"
    

    I suggest using an OpenStruct to organize your data:

    your_struct_name =  JSON.parse(yourJson, object_class: OpenStruct)
    

    Then you get all the things you want. For the operations you show:

    #change_key(hash, "features.additional-options", false)
    your_struct_name.features['additional-options'] = false 
    #this one above you set in this hash-like manner because of the '-' in the middle of the key. Otherwise you could just do your_struct_name.features.additional_options = false
    
    #del_from_array(hash, "persons.name=mary.activities", "cycling")
    your_struct_name.persons.last.activities.delete('swimming')
    
    # or selecting by name:
    your_struct_name.persons.select {|person| person.name == 'mary' }.first.activities.delete('swimming')
    
    #add_to_array(hash, "persons.name=mary.activities", "hockey")
    your_struct_name.persons.last.activities << 'hockey'
    
    #del_key(hash, "data_map")
    your_struct_name.delete_field('data_map')
    
    #del_key(hash, persons.name=john.profile)
    ...
    
    #del_key(hash, persons.name=mary.credits)
    ...
    

    Then, after you make your changes, you can use:

    your_struct_name.to_h.to_json
    

    You can also use the method as_json to get a structure very similar to what you showed on the question:

    your_struct_name.as_json
    

    OpenStruct is very nice to deal with data that has a changing structure. If you have data that can be "modeled", has a name you can call, has some attributes you can predict, and even methods you will use for this data, I suggest you to create a Class to describe this data, its properties and attributes (it can even inherit from OpenStruct). Then work inside this Class domain, creating a layer of abstraction. This way your code gets a lot more robust and readable. Don't forget to create automatic tests! It saves you a lot of time.

    The way you organize and abstract your data, and specially the way you name entities are things that have high impact on code quality.

    For further reading see: Object and ActiveData.

    0 讨论(0)
提交回复
热议问题